[英]Mocking an attribute change on a parameter - using Moq
我正在使用Moq来模拟我的Repository层,所以我可以进行单元测试。
我的存储库层插入方法在发生成功的数据库插入时更新我的实体的Id属性。
在调用Insert方法时,如何配置moq以更新实体的Id属性?
存储库代码: -
void IAccountRepository.InsertAccount(AccountEntity account);
单元测试:-
[TestInitialize()]
public void MyTestInitialize()
{
accountRepository = new Mock<IAccountRepository>();
contactRepository = new Mock<IContactRepository>();
contractRepository = new Mock<IContractRepository>();
planRepository = new Mock<IPlanRepository>();
generator = new Mock<NumberGenerator>();
service = new ContractService(contractRepository.Object, accountRepository.Object,
planRepository.Object, contactRepository.Object, generator.Object);
}
[TestMethod]
public void SubmitNewContractTest()
{
// Setup Mock Objects
planRepository
.Expect(p => p.GetPlan(1))
.Returns(new PlanEntity() { Id = 1 });
generator
.Expect(p => p.GenerateAccountNumber())
.Returns("AC0001");
// Not sure what to do here?
// How to mock updating the Id field for Inserts?
//
// Creates a correctly populated NewContractRequest instance
NewContractRequest request = CreateNewContractRequestFullyPopulated();
NewContractResponse response = service.SubmitNewContract(request);
Assert.IsTrue(response.IsSuccessful);
}
ContractService类(WCF服务合同)的实现片段。
AccountEntity account = new AccountEntity()
{
AccountName = request.Contact.Name,
AccountNumber = accountNumber,
BillingMethod = BillingMethod.CreditCard,
IsInvoiceRoot = true,
BillingAddressType = BillingAddressType.Postal,
ContactId = request.Contact.Id.Value
};
accountRepository.InsertAccount(account);
if (account.Id == null)
{
// ERROR
}
如果这些信息可能有点缺乏,我深表歉意。 我今天才开始学习moq和模拟框架。 AC
您可以使用Callback方法来模拟副作用。 就像是:
accountRepository
.Expect(r => r.InsertAccount(account))
.Callback(() => account.ID = 1);
这是未经测试的,但它是沿着正确的路线。
我不确定这是如何工作的,因为在方法中创建了帐户,所以当我将ID的值设置为1时,它不是我将要引用的实例。
也许我的设计存在缺陷,我应该在IAccountRepository.InsertAccount实现中检查ID> 0,然后如果没问题则返回bool。 虽然我在插入一个有相关对象需要插入的帐户时遇到了问题(并且Id已经被处理)。
我发现这是我的问题的答案
accountRepository
.Expect(p => p.InsertAccount(It.Is<AccountEntity>(x => x.Id == null)))
.Callback<AccountEntity>(a => a.Id = 1);
谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.