验证方法调用和参数没有模拟框架
作者:互联网
我正在寻找验证给定方法(单元)执行正确逻辑的最佳方法.
在这种情况下,我有一个类似于以下方法:
public void GoToMyPage()
{
DispatcherHelper.BeginInvoke(() =>
{
navigationService.Navigate("mypage.xaml", "id", id);
});
}
navigationService是接口INavigationService的注入模拟版本.现在,我想在单元测试中验证是否使用正确的参数调用了Navigate(…).
但是,在一定程度上不支持Windows Phone IL的发光,在这种程度上,模拟框架可以创建动态代理并分析呼叫.因此,我需要手动分析.
一个简单的解决方案是将Navigate(…)方法中调用的值保存在公共属性中,并在单元测试中检查它们.但是,这对于所有不同种类的模拟和方法都非常繁琐.
所以我的问题是,有没有更聪明的方法可以使用C#功能(例如委托)创建分析调用,而无需使用基于反射的代理,也不必手动保存调试信息?
解决方法:
我的方法是手动创建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");
}
我还没有考虑传递给方法的参数,但是我想这是一个好的开始.
标签:unit-testing,mocking,windows-phone,c 来源: https://codeday.me/bug/20191201/2081151.html