2008-10-08 1 views
3

Я использую Moq, чтобы издеваться над моим слоем репозитория, чтобы я мог тестировать модуль.Смещение изменения атрибута по параметру - с помощью Moq

В моем методе вставки хранилища обновляется свойство Id моих объектов, когда происходит успешная вставка db.

Как настроить moq для обновления свойства Id объекта при вызове метода Insert?

код Repository: -

void IAccountRepository.InsertAccount(AccountEntity account); 

Unit Test: -

[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

ответ

5

Вы можете использовать метод обратного вызова, чтобы имитировать побочные эффекты. Что-то вроде:

accountRepository 
    .Expect(r => r.InsertAccount(account)) 
    .Callback(() => account.ID = 1); 

Это непроверено, но это по правому краю.

+0

спасибо, что это было полезно для меня – BigOmar 2013-01-08 20:59:24

2

Я не уверен, как это будет работать, потому что учетная запись создается внутри метода, так что это не экземпляр, я буду иметь в виду, когда я установить значение ID 1.

Может быть, есть изъян в моем дизайне, и я должен проверять идентификатор> 0 внутри реализации IAccountRepository.InsertAccount, а затем возвращать bool, если все в порядке. Хотя тогда у меня возникла проблема с вставкой учетной записи, у которой есть связанный объект, который необходимо выполнить (и Id genereated).

Я нашел, что это ответ на мою проблему

accountRepository 
    .Expect(p => p.InsertAccount(It.Is<AccountEntity>(x => x.Id == null))) 
    .Callback<AccountEntity>(a => a.Id = 1); 

спасибо.

Смежные вопросы