当我在夹具中创建新的自定义 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 版本。