ArchUnitTest 未按预期运行

问题描述 投票:0回答:1

任何人都可以说为什么我会收到这些错误,给出下面的配置?

Message: 
  ArchUnitNET.xUnit.FailedArchRuleException : "Classes that are Classes that are Classes that implement 'IRequest' and are not abstract and have name matching ".+Command$" and have name matching ".+Command$" should reside in namespace with full name matching ".+\.Commands\."" failed:
    Core.Application.MasterDataSync.Commands.SynchronizeMasterDataCommand does reside in Core.Application.MasterDataSync.Commands
    Core.Application.ManagerChain.Commands.CalculateManagerChainCommand does reside in Core.Application.ManagerChain.Commands
    Core.Application.EmployeeSync.Commands.SynchronizeEmployeeCommand does reside in Core.Application.EmployeeSync.Commands
    Core.Application.EmployeeFixedPaymentSummaries.Commands.SynchronizeLatestYearlyPaymentsCommand does reside in Core.Application.EmployeeFixedPaymentSummaries.Commands

获取组件:

using System.Reflection;
using ArchUnitNET.Domain;
using ArchUnitNET.Loader;
using Assembly = System.Reflection.Assembly;

namespace Corsica.Tests.ArchUnit;

public static class Corsica
{
    public static readonly Architecture ARCHITECTURE =
        new ArchLoader()
            .LoadAssemblies(GetSolutionAssemblies())
            .Build();

    private static Assembly[] GetSolutionAssemblies()
    {
        var assemblies = Directory
            .GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll")
            .Select(x => Assembly.Load(AssemblyName.GetAssemblyName(x)))
            .Where(x => x.FullName!.StartsWith("Core"));
        return assemblies.ToArray();
    }
}

课程:

using MediatR;

namespace Core.Application.EmployeeFixedPaymentSummaries.Commands;
public class SynchronizeLatestYearlyPaymentsCommand : IRequest { }

using MediatR;

namespace Core.Application.EmployeeSync.Commands;

public class SynchronizeEmployeeCommand : IRequest { }

using MediatR;

namespace Core.Application.MasterDataSync.Commands;

public class SynchronizeMasterDataCommand : IRequest
{
}

using MediatR;

namespace Core.Application.ManagerChain.Commands;

public class CalculateManagerChainCommand : IRequest { }

测试类,定义应该通过的规则。

using ArchUnitNET.Domain;
using ArchUnitNET.xUnit;
using MediatR;
using static ArchUnitNET.Fluent.ArchRuleDefinition;

namespace Corsica.Tests.ArchUnit;

public class Cqrs
{
    private static readonly IObjectProvider<IType> NON_ABSTRACT_CLASSES_IMPLEMENTING_IREQUEST =
            Classes()
                .That().AreAssignableTo(typeof(IRequest<>)).Or().AreAssignableTo(typeof(IRequest)).As("Classes that implement 'IRequest'")
                .And().AreNotAbstract()
                .And().HaveName(".+Command$", true);

    private static readonly IObjectProvider<IType> COMMANDS =
        Classes().That().Are(NON_ABSTRACT_CLASSES_IMPLEMENTING_IREQUEST)
            .And().HaveName(".+Command$", true);

    private static readonly IObjectProvider<IType> QUERIES =
        Classes().That().Are(NON_ABSTRACT_CLASSES_IMPLEMENTING_IREQUEST)
            .And().HaveName(".+Query$", true);

    [Fact]
    public void ClassesInheritingFromIRequestShouldHaveNameEndingWithCommandOrQuery()
    {
        Classes().That().Are(NON_ABSTRACT_CLASSES_IMPLEMENTING_IREQUEST)
            .Should().HaveName(".+(Command|Query)$", true).As("should have names ending with 'Command' or 'Query'")
            .Check(Corsica.ARCHITECTURE);
    }

    [Fact]
    public void CommandsShouldResideInCommandsNamespace()
    {
        Classes().That().Are(COMMANDS)
            .Should().ResideInNamespace(".+\\.Commands\\.", true)
            .Check(Corsica.ARCHITECTURE);
    }

    [Fact]
    public void QueriesShouldResideInQueriesNamespace()
    {
        Classes().That().Are(QUERIES)
            .Should().ResideInNamespace(".+\\.Queries\\.", true)
            .Check(Corsica.ARCHITECTURE);
    }

}

我没想到会出现任何错误。它运行整个项目,但只会引发我提到的那些类的错误。

.net automated-tests .net-7.0 archunit
1个回答
0
投票

你的例子对我有用

Classes().That().Are(COMMANDS).Should().ResideInNamespace(".+\\.Commands(\\.|$)", true).Check(Architecture);

这是,允许“命令”位于名称空间的末尾或内部。

© www.soinside.com 2019 - 2024. All rights reserved.