【问题标题】:Dangerous to use Class Scoped vars in TestMethods在 TestMethods 中使用 Class Scoped vars 很危险
【发布时间】:2014-07-21 17:29:34
【问题描述】:

我对最小起订量和 TDD/单元测试都是新手。我发现自己在每个测试方法的“排列”部分重复了很多相同的代码,似乎真的应该有更好的方法。

首先是经常重复的代码:

#region Arrange

    #region create my Mock Objects

        var serviceMock = new Mock<IOrganizationService>();
        var factoryMock = new Mock<IOrganizationServiceFactory>();
        var tracingServiceMock = new Mock<ITracingService>();
        var notificationServiceMock = new Mock<IServiceEndpointNotificationService>();
        var pluginContextMock = new Mock<IPluginExecutionContext>();
        var serviceProviderMock = new Mock<IServiceProvider>();

    #endregion

    #region Authentication Stuff

        var organizationUri = "http://.../XRMServices/2011/Organization.svc";
        var orgServiceManagement = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(organizationUri));
        var credentials = new AuthenticationCredentials();
        var username = "USER_ID";
        var password = "USER_PWD";
        var domain = "MyDomain";
        credentials.ClientCredentials. Windows.ClientCredential = new NetworkCredential(username, password, domain);
        IOrganizationService service = new OrganizationServiceProxy(orgServiceManagement, credentials.ClientCredentials);

    #endregion

#endregion

我考虑过制作自定义 sn-ps、常量等,但这并不能真正节省重复代码,只是节省了我一些打字时间。

接下来我考虑在类级别对上述所有内容进行范围界定...但是一些警告铃声响起...如果该类为所有测试方法实例化一次,那么可能存在变量污染吗?鉴于这里的小样本确实不会发生,但我正在努力提前思考/养成良好的做法和习惯。

创建一个在该对象中定义了所有这些的“Mock & Authentication”对象怎么样?然后我可以拥有几个具有不同凭据的对象,并且我的测试方法可以仅引用/使用所需的一种变体?

那么对于将一些 DRY 原则应用于我的测试用例,您有什么建议/建议。

【问题讨论】:

    标签: c# unit-testing moq moq-3


    【解决方案1】:

    首先,您的设置非常庞大。如果这是一个单元测试,这需要重构。您确定您的被测组件只做一件事且只做一件事吗?从依赖项的名称来看,我认为不会。

    接下来我考虑在类级别对上述所有内容进行范围界定...但是一些警告铃响了...如果该类为所有测试方法实例化一次,那么可能存在变量污染吗?

    不,大多数测试运行程序会在每次测试运行时创建测试类实例,并且单元测试框架通常允许在测试设置之前进行,一段代码(通常是方法或构造函数)就是这样做的。

    在 NUnit 中你有 [SetUp] 属性(MS 测试使用 [TestInitialize] 而 xUnit 使用类构造函数):

    [SetUp]
    public void InitializeDependencies()
    {  
        serviceMock = new Mock<IOrganizationService>();
        // ...
    }
    

    这就是你通常解决这类问题的方法。

    如果创建一个在该对象中定义了所有这些的“Mock & Authentication”对象呢?

    虽然这对于 authentication 部分可能是一个好主意,但对于模拟来说肯定不是那么好。您甚至认为它的事实再次敲响了重构的钟声。

    【讨论】:

    • 非常感谢。我已经根据您提供的方向/建议进行了重构。这有助于减少大量重复代码并提高性能。
    猜你喜欢
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多