ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

验证方法调用和参数没有模拟框架

2019-12-01 14:09:29  阅读:190  来源: 互联网

标签:unit-testing mocking windows-phone c


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

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有