我正在寻找验证给定方法(单元)执行正确逻辑的最佳方法。
在这种情况下,我的方法类似于:
public void GoToMyPage()
{
DispatcherHelper.BeginInvoke(() =>
{
navigationService.Navigate("mypage.xaml", "id", id);
});
}
navigationService
是一个注入模拟的接口版本INavigationService
。现在,我想在单元测试中验证使用正确的参数调用Navigate(...)
。
但是,在Windows Phone上,IL发射不受支持,其中模拟框架可以创建动态代理并分析调用。因此,我需要手动分析。
一个简单的解决方案是在公共属性中保存Navigate(...)
方法中调用的值,并在单元测试中检查它们。然而,这对于所有不同类型的模拟和方法都是相当无聊的。
所以我的问题是,是否有更智能的方法使用C#功能(如委托)创建分析调用,而不使用基于反射的代理,而无需手动保存调试信息?
答案 0 :(得分:3)
我的方法是手动创建一个可测试的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");
}
我没有想过传递给方法的参数,但我想这是一个好的开始。