-1

我正在测试模型存储库以查看它是否调用消息总线。我不确定这是否是一个好的测试,但这是我的想法:我通常会将 bus.send 放入控制器(这是一个 MVC Web 应用程序),但因为我不想专门测试我的控制器逻辑上,我把它移到了存储库中。就我而言,控制器很简单。Repository 使用总线和模型数据库来构建视图模型。

无论如何,这个问题的重点是我正在运行的最小起订量测试。我模拟了总线并想验证它是从存储库中调用的。

测试看起来像这样:

public class when_creating_new_clinic
{
    Establish context = () =>
    {
        clinicID = Guid.NewGuid();
        model = new ClinicModel
        {
            ClinicID = clinicID,
            Alias = "alias",
            Title = "title"
            // stuff omitted
        };
        newClinicData = new NewClinicData
        {
            ClinicID = clinicID,
            Alias = "alias",
            Title = "title"
            // stuff omitted 
        };
        cmd = new CreateClinicCmd(newClinicData);
        bus = new Mock<IMessageBusAgent>();
        repository = new ClinicModelRepository(bus.Object);

        bus.Setup(b => b.Send(cmd));
    };

    Because it = () => repository.Create(model);

    It should_send_create_clinic_command_to_bus = () =>
    {
        bus.Verify(b => b.Send(cmd), Times.Exactly(1));
    };

    static ClinicModelRepository repository;
    static ClinicModel model;
    static Mock<IMessageBusAgent> bus;
    static NewClinicData newClinicData;
    static Guid clinicID;
    static CreateClinicCmd cmd;
}

存储库的要点是这样的:

public class ClinicModelRepository : IClinicModelRepository
{
    private readonly IMessageBusAgent m_bus;

    public ClinicModelRepository(IMessageBusAgent bus)
        : this()
    {
        m_bus = bus;
    }

    public void Create(ClinicModel clinicModel)
    {
        // stuff omitted (data is mapped from clinicModel)          

        m_bus.Send(new CreateClinicCmd(data));
    }
}

IMessageBusAgent 声明为:

public interface IMessageBusAgent : IDomainCommandSender, IDomainEventPublisher, IUnitOfWork
{
}

测试结果如下所示:

when creating new clinic

» 应该将创建诊所命令发送到总线 (FAIL)

测试“应将创建诊所命令发送到总线”失败:Moq.MockException:预期在模拟上调用 1 次,但为 0 次:b => b.Send(when_creating_new_clinic.cmd)

Configured setups:
b => b.Send<CreateClinicCmd>(when_creating_new_clinic.cmd), Times.Never

Performed invocations:
IDomainCommandSender.Send(ArReg.Commands.CreateClinicCmd)
IUnitOfWork.Commit()
at Moq.Mock.ThrowVerifyException(MethodCall expected, IEnumerable`1 setups, IEnumerable`1 actualCalls, Expression expression, Times times, Int32 callCount)
at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times)
at Moq.Mock.Verify[T](Mock mock, Expression`1 expression, Times times, String failMessage)
at Moq.Mock`1.Verify(Expression`1 expression, Times times)
Repositories\when_creating_new_clinic.cs(51,0): at ArReg.Tests.Specs.Repositories.when_creating_new_clinic.<.ctor>b__4()
at Machine.Specifications.Model.Specification.InvokeSpecificationField()
at Machine.Specifications.Model.Specification.Verify()

0 次通过,1 次失败,0 次跳过,耗时 3.58 秒(Machine.Specifications 0.4.24-f7fb6b5)。

Send() 命令在 IDomainCommandSender 中声明,那么我需要如何设置测试以便验证正确的调用?

谢谢

4

1 回答 1

3

您的 bus-moq 设置有一点错误。它应该是这样的:

bus.Setup(b => b.Send(It.IsAny<CreateClinicCmd>()));

原因:您使用CreateClinicCmd上面创建的两个代码行的实例编写了设置。在您的测试类中,ClinicModelRepository您创建该类的另一个实例并调用您的总线模拟。此调用与您在设置中编写的调用不匹配。

于 2011-11-14T10:06:30.100 回答