当我在夹具中创建新的自定义 FluentValidator 对象时,.Net Core 3.1 Xunit runnig 测试导致堆栈溢出错误 class
.Net Core 3.1 Xunit runnig tests causes stack overflow error when I create new Custom FluentValidator object in fixture class
我正在尝试编写一个测试 class 来测试我的验证器,但我遇到了一个错误,将在下面进行描述。
我有一个测试 class 来测试我的实体,这些实体只有属性,class 目前是空的。
using Xunit;
namespace ECommercial.Business.Tests.EntityValidationTests.FluentValidation
{
public class EntityValidationTests:IClassFixture<EntityValidationFixture>
{
[Fact]
public void validateShouldSuccess(){
}
}
}
如上所示,有一个测试 class 有一个空测试 运行。问题是在下面的夹具中创建 AddressValidator、ProductValidator 等也会导致此错误消息:
错误信息
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.0 (64-bit .NET Core 3.1.8)
[xUnit.net 00:00:00.57] Discovering: ECommercial.Business.Tests
[xUnit.net 00:00:00.62] Discovered: ECommercial.Business.Tests
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.0 (64-bit .NET Core 3.1.8)
[xUnit.net 00:00:00.58] Starting: ECommercial.Business.Tests
***<IWROTEHERE> AT THİS LİNE PROGRAM WAITS A FEW SECONDS</IWROTHERE>***
active test running is canceled. reason: Test crashed main process : Stack overflow.
----- Test Execution Summary -----
Total tests: 0. Passed: 0. Failed: 0. Skipped: 0
如所见错误说有堆栈溢出。
我制作了这样的夹具代码并 运行 测试,问题已经解决,但如果我 运行 在构造函数中包含注释行后进行测试,问题再次发生。
using System;
using System.Collections.Generic;
using ECommercial.Entites.concrete;
using ECommercial.Business.ValidationRules.FluentValidation.EntityValidators;
namespace ECommercial.Business.Tests.EntityValidationTests.FluentValidation
{
public class EntityValidationFixture : IDisposable
{
public static List<Object[]> Entities = new List<Object[]>();
public static List<Object[]> Validators = new List<Object[]>();
public static List<Object[]> EntityValidators= new List<Object[]>();
public EntityValidationFixture()
{
// new AddressValidator();
}
public void Dispose()
{
}
}
}
导致错误的自定义验证器示例文件
using System.Data;
using ECommercial.Entites.concrete;
using FluentValidation;
namespace ECommercial.Business.ValidationRules.FluentValidation.EntityValidators
{
public class AddressValidator : AbstractValidator<Address>
{
public AddressValidator()
{
RuleFor(x=>x.Id)
.PrimaryKeyIdRule();
RuleFor(x=>x.UserShopId)
.PrimaryKeyIdRule();
RuleFor(x=>(int)x.CityId)
.PrimaryKeyIdRule();
}
}
}
此规则导致验证器发生错误。如果我删除它们,问题就消失了。
主键约束代码
public static IRuleBuilderOptions<T,int> PrimaryKeyIdRule<T>(this IRuleBuilder<T,int> ruleBuilder){
return PrimaryKeyIdRule(ruleBuilder);
}
public static IRuleBuilderOptions<T,long> PrimaryKeyIdRule<T>(this IRuleBuilder<T,long> ruleBuilder){
return ruleBuilder
.GreaterThanOrEqualTo(0)
.NotNull();
}
public static IRuleBuilderOptions<T,int> PrimaryKeyIdRule<T>(this IRuleBuilder<T,int> ruleBuilder)
{
return PrimaryKeyIdRule(ruleBuilder);
}
public static IRuleBuilderOptions<T,long> PrimaryKeyIdRule<T>(this IRuleBuilder<T,long> ruleBuilder)
{
return ruleBuilder
.GreaterThanOrEqualTo(0)
.NotNull();
}
实际上你每次都在调用同一个方法。它不调用 long
版本。
我正在尝试编写一个测试 class 来测试我的验证器,但我遇到了一个错误,将在下面进行描述。
我有一个测试 class 来测试我的实体,这些实体只有属性,class 目前是空的。
using Xunit;
namespace ECommercial.Business.Tests.EntityValidationTests.FluentValidation
{
public class EntityValidationTests:IClassFixture<EntityValidationFixture>
{
[Fact]
public void validateShouldSuccess(){
}
}
}
如上所示,有一个测试 class 有一个空测试 运行。问题是在下面的夹具中创建 AddressValidator、ProductValidator 等也会导致此错误消息:
错误信息
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.0 (64-bit .NET Core 3.1.8)
[xUnit.net 00:00:00.57] Discovering: ECommercial.Business.Tests
[xUnit.net 00:00:00.62] Discovered: ECommercial.Business.Tests
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.4.0 (64-bit .NET Core 3.1.8)
[xUnit.net 00:00:00.58] Starting: ECommercial.Business.Tests
***<IWROTEHERE> AT THİS LİNE PROGRAM WAITS A FEW SECONDS</IWROTHERE>***
active test running is canceled. reason: Test crashed main process : Stack overflow.
----- Test Execution Summary -----
Total tests: 0. Passed: 0. Failed: 0. Skipped: 0
如所见错误说有堆栈溢出。
我制作了这样的夹具代码并 运行 测试,问题已经解决,但如果我 运行 在构造函数中包含注释行后进行测试,问题再次发生。
using System;
using System.Collections.Generic;
using ECommercial.Entites.concrete;
using ECommercial.Business.ValidationRules.FluentValidation.EntityValidators;
namespace ECommercial.Business.Tests.EntityValidationTests.FluentValidation
{
public class EntityValidationFixture : IDisposable
{
public static List<Object[]> Entities = new List<Object[]>();
public static List<Object[]> Validators = new List<Object[]>();
public static List<Object[]> EntityValidators= new List<Object[]>();
public EntityValidationFixture()
{
// new AddressValidator();
}
public void Dispose()
{
}
}
}
导致错误的自定义验证器示例文件
using System.Data;
using ECommercial.Entites.concrete;
using FluentValidation;
namespace ECommercial.Business.ValidationRules.FluentValidation.EntityValidators
{
public class AddressValidator : AbstractValidator<Address>
{
public AddressValidator()
{
RuleFor(x=>x.Id)
.PrimaryKeyIdRule();
RuleFor(x=>x.UserShopId)
.PrimaryKeyIdRule();
RuleFor(x=>(int)x.CityId)
.PrimaryKeyIdRule();
}
}
}
此规则导致验证器发生错误。如果我删除它们,问题就消失了。
主键约束代码
public static IRuleBuilderOptions<T,int> PrimaryKeyIdRule<T>(this IRuleBuilder<T,int> ruleBuilder){
return PrimaryKeyIdRule(ruleBuilder);
}
public static IRuleBuilderOptions<T,long> PrimaryKeyIdRule<T>(this IRuleBuilder<T,long> ruleBuilder){
return ruleBuilder
.GreaterThanOrEqualTo(0)
.NotNull();
}
public static IRuleBuilderOptions<T,int> PrimaryKeyIdRule<T>(this IRuleBuilder<T,int> ruleBuilder)
{
return PrimaryKeyIdRule(ruleBuilder);
}
public static IRuleBuilderOptions<T,long> PrimaryKeyIdRule<T>(this IRuleBuilder<T,long> ruleBuilder)
{
return ruleBuilder
.GreaterThanOrEqualTo(0)
.NotNull();
}
实际上你每次都在调用同一个方法。它不调用 long
版本。