Правильное использование обратных вызовов Moq в соответствии с AAA - PullRequest
0 голосов
/ 06 мая 2010

Я создал модульный тест, который проверяет взаимодействия в моем классе ViewModel в приложении Silverlight. Чтобы сделать этот тест, я издеваюсь над интерфейсом службы, введенным в ViewModel. Я использую Moq Framework для насмешек.

, чтобы иметь возможность убедиться, что связанный объект в ViewModel преобразован правильно, я использовал обратный вызов:


[Test]
public void SaveProposal_Will_Map_Proposal_To_WebService_Parameter()
{
 var vm = CreateNewCampaignViewModel();
 var proposal = CreateNewProposal(1, "New Proposal");

 Services.Setup(x => x.SaveProposalAsync(It.IsAny<saveProposalParam>())).Callback((saveProposalParam p) =>
 {
  Assert.That(p.plainProposal, Is.Not.Null);
  Assert.That(p.plainProposal.POrderItem.orderItemId, Is.EqualTo(1));
  Assert.That(p.plainProposal.POrderItem.orderName, Is.EqualTo("New Proposal"));
 });

 proposal.State = ObjectStates.Added;
 vm.CurrentProposal = proposal;
 vm.Save();
}

Работает нормально, но, если вы заметили, с помощью этого механизма часть модульного теста Assert и Act поменялась местами (Assert предшествует Acting). Есть ли лучший способ сделать это, сохранив правильный порядок AAA?

1 Ответ

2 голосов
/ 21 мая 2010

Я не уверен, что вы изменили семантику заказа AAA. Рассмотрим выполнение теста. Ваш поддельный интерфейс не будет вызываться до тех пор, пока действие не вызовет его. Поэтому во время выполнения ваша программа по-прежнему следует потокам Arrange, Act и Assert.

Альтернативой может быть использование Data Injection и создание интерфейса между вашей CampaignViewModel и веб-службой, которую он использует. Затем вы можете создать класс в ваших UnitTests, который сохраняет информацию о параметрах и Assert для этого члена / свойства класса, а не использовать Moq для создания прокси на лету.

Moq не следует использовать для имитации хранения или назначения. Вместо этого используйте Moq, чтобы предоставить фиктивные механизмы и значения, позволяющие выполнять ваши юнит-тесты. Если утверждение хранилища является обязательным требованием, найдите время, чтобы создать класс, который будет хранить ваши значения.

...