我有一个测试方法,断言是否已调用客户端帐户存储库的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类具有完全相同的属性。获取失败的断言通过的输入将被欣赏,因为代码已连线,但它失败了。
答案 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()
。