gpt4 book ai didi

c# - 在没有模拟框架的情况下验证方法调用和参数

转载 作者:行者123 更新时间:2023-11-30 16:25:16 25 4
gpt4 key购买 nike

我正在寻找验证给定方法(单元)是否执行正确逻辑的最佳方法。

在这种情况下,我有一个类似于以下的方法:

public void GoToMyPage()
{
DispatcherHelper.BeginInvoke(() =>
{
navigationService.Navigate("mypage.xaml", "id", id);
});
}

navigationService 是接口(interface)的注入(inject)模拟版本,INavigationService。现在,我想在单元测试中验证是否使用正确的参数调用了 Navigate(...)

但是,在 Windows Phone 上,IL 发射在一定程度上不受支持,模拟框架可以在其中创建动态代理并分析调用。因此我需要手动分析它。

一个简单的解决方案是将在 Navigate(...) 方法中调用的值保存在公共(public)属性中,并在单元测试中检查它们。然而,对于所有不同类型的模拟和方法来说,这是相当令人厌烦的。

所以我的问题是,是否有更智能的方法来使用 C# 功能(例如委托(delegate))创建分析调用,而不使用基于反射的代理,并且无需手动保存调试信息?

最佳答案

我的方法是手动创建 INavigationService 的可测试实现,以捕获调用和参数并允许您稍后验证它们。

public class TestableNavigationService : INavigationService
{
Dictionary<string, Parameters> Calls = new Dictionary<string, Parameters>();

public void Navigate(string page, string parameterName, string parameterValue)
{
Calls.Add("Navigate" new Parameters()); // Parameters will need to catch the parameters that were passed to this method some how
}

public void Verify(string methodName, Parameters methodParameters)
{
ASsert.IsTrue(Calls.ContainsKey(methodName));
// TODO: Verify the parameters are called correctly.
}
}

这可以在您的测试中使用,例如:

public void Test()
{
// Arrange
TestableNavigationService testableService = new TestableNavigationService ();
var classUnderTest = new TestClass(testableService );

// Act
classUnderTest.GoToMyPage();

// Assert
testableService.Verify("Navigate");
}

我没有考虑传递给方法的参数,但我想这是一个好的开始。

关于c# - 在没有模拟框架的情况下验证方法调用和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10123829/

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