c# - 如何在 fake it easy 中正确断言 MustHaveHappend(object)

标签 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) Expected to find it at least once but found it #0 times among the calls:

ClientAccount 和 ClientAccountDto 类具有完全相同的属性。使失败的断言通过的输入将受到赞赏,因为代码已连接以使其通过,但它失败了。

最佳答案

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

有几个选项可以解决这个问题:

  • 覆盖 Equals ClientAccountDto中的方法(并不理想,因为 DTO 通常不需要这个)
  • 注入(inject)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() .

关于c# - 如何在 fake it easy 中正确断言 MustHaveHappend(object),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47764577/

相关文章:

c# - 选择数据网格(wpf)中的行索引

c# - 是否有理由两次抛出异常?

c# - 正在寻找 C# TDD 框架?

caching - 避免单例和全局变量——但是缓存、提供者、 Controller ……呢?

php - 如何在 phpunit 中引用外部数据提供者?

asp.net-mvc - AutoMapper 中是否有办法指定所有被映射的字符串都将被修剪

nuget - 运行NuGet pack命令时,出现错误: 'AutoMapper' already has a dependency defined for 'NETStandard.Library'

c# - 移动实时视频编码

asp.net-mvc - View 模型和请求-响应消息传递模式之间的 MVC 映射

c# - 如何将包含 3 个项目的元组列表分组,其中 element.item3 == element2.item2