问题描述
我正在尝试编写一个测试类来测试我的验证器,但下面将描述我遇到的错误。
我有一个测试类来测试我的实体,这些实体只有属性并且该类目前为空。
using Xunit;
namespace ECommercial.Business.Tests.EntityValidationTests.FluentValidation
{
public class EntityValidationTests:IClassFixture<EntityValidationFixture>
{
[Fact]
public void validateShouldSuccess(){
}
}
}
如上所示,有一个测试类要运行一个空测试。问题在于,在下面的固定装置中也创建了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
版本。