gpt4 book ai didi

unit-testing - 根据 AAA 正确使用 Moq 回调

转载 作者:行者123 更新时间:2023-11-28 21:15:02 24 4
gpt4 key购买 nike

我已经创建了一个单元测试来测试 Silverlight 应用程序中我的 ViewModel 类的交互。为了能够进行此测试,我正在模拟注入(inject)到 ViewModel 的服务接口(interface)。我正在使用 Moq 框架进行模拟。

为了能够验证 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();
}

它工作正常,但如果您注意到,使用这种机制,单元测试的断言和行动部分已经交换了它们的部分(断言先于行动)。有没有更好的方法来做到这一点,同时保留正确的 AAA 顺序?

最佳答案

我不确定您是否更改了 AAA 订单的语义。考虑测试的执行。在 Action 调用它之前,您的模拟接口(interface)不会被调用。因此,在执行过程中,您的程序仍然遵循 Arrange、Act 和 Assert 流程。

另一种方法是使用数据注入(inject)并在您的 CampaignViewModel 和它使用的网络服务之间创建一个接口(interface)。然后,您可以在单元测试中创建一个类来保存您的参数信息并对该类成员/属性进行断言,而不是使用 Moq 即时创建代理。

Moq 不应用于模拟存储或分配。相反,使用 Moq 提供虚拟机制和值以允许您的单元测试执行。如果断言存储是必需的,那么请花时间创建一个将保留您的值的类。

关于unit-testing - 根据 AAA 正确使用 Moq 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2779224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com