[英]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.