Насмешка над изменением атрибута параметра - с помощью Moq - PullRequest
3 голосов
/ 08 октября 2008

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

Мой слой репозитория Методы вставки обновляют свойство Id моих сущностей при успешной вставке БД.

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

Код репозитория: -

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 и mocking frameworks сегодня. ас

Ответы [ 2 ]

5 голосов
/ 08 октября 2008

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

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

Это не проверено, но это правильно.

2 голосов
/ 09 октября 2008

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

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

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

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

спасибо.

...