如何正确地断言MustHaveHappend(对象)是假的

时间:2017-12-12 02:41:29

标签: c# tdd automapper fakeiteasy

我有一个测试方法,断言是否已调用客户端帐户存储库的CreateClient方法。请参见下面的测试。

[TestMethod]
    public void CreateNewBasicClientAccount_NewBasicClient_CreatesNewClientBasicClient()
    {
        // Arrange

        var clientAccountToCreate = new ClientAccount
        {                
            Name = "Name",                
        };

        var clientAccountToCreateDto = AutoMapper.Mapper.Map<ClientAccount, ClientAccountDto>(clientAccountToCreate);


        var clientAccountRepository = A.Fake<IClientAccountRepository>();
        var clientAccountManager = new ClientAccountManager(clientAccountRepository);

        // Act

        clientAccountManager.CreateClient(clientAccountToCreate);

        // Assert

        A.CallTo(
            () => clientAccountRepository.CreateClient(A<ClientAccountDto>.That.IsNotNull<ClientAccountDto>()))
            .MustHaveHappened();

        A.CallTo(
            () => clientAccountRepository.CreateClient(A<ClientAccountDto>.Ignored))
            .MustHaveHappened();

        A.CallTo(
            () => clientAccountRepository.CreateClient(clientAccountToCreateDto))
            .MustHaveHappened();
    }

测试中ClientAccountManager类的Act部分正在调用存储库的CreateClient方法

public void CreateClient(ClientAccount client)
    {
        var clientDto = AutoMapper.Mapper.Map<ClientAccount, ClientAccountDto>(client);
        _clientAccountRepository.CreateClient(clientDto);
    }

测试传递中的前两个断言,但更具体的第三个断言失败并带有结果消息

  

InterfaceNameSpace.IClientAccountRepository.CreateClient(clientDto:DtoNameSpace.ClientAccountDto)     预计会发现它至少一次,但在电话中找到#0次:

ClientAccount和ClientAccountDto类具有完全相同的属性。获取失败的断言通过的输入将被欣赏,因为代码已连线,但它失败了。

1 个答案:

答案 0 :(得分:1)

这是因为传递给方法的实际ClientAccountDto与您在测试中创建的实例不同,因此它们不被视为相等。

有几种方法可以解决这个问题:

  • 覆盖Equals中的ClientAccountDto方法(不理想,因为您通常不需要这个用于DTO)
  • IMapper注入ClientAccountManager,而不是使用静态Mapper类,并配置IMapper以返回ClientAccountDto的特定实例
  • 测试ClientAccountDto的特定属性,如下所示:

    A.CallTo(
        () => clientAccountRepository.CreateClient(A<ClientAccountDto>.That.Matches(x => x.Name == "Name")))
        .MustHaveHappened();
    

无关注:您无需在A<ClientAccountDto>.That.IsNotNull<ClientAccountDto>()中再次指定类型,只需撰写A<ClientAccountDto>.That.IsNotNull()