在测试方法中使用Class Scoped vars很危险

时间:2014-07-21 17:29:34

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

我是MOQ和TDD /单元测试的新手。我发现自己在我的" Arrange"中重复了很多相同的代码。每种测试方法的一部分似乎确实应该有更好的方法。

首先是重复的代码:

#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

我考虑过制作自定义代码段,常量等,但这样就不会真正保存重复的代码,只是省时间输入。

接下来我想到了在班级一级确定所有内容......但是一些警告响了......如果班级为所有测试方法实例化一次,那么可能存在可变污染吗?鉴于这里的小样本确实不会发生,但我试图提前思考/养成良好的习惯和习惯。

如何创建一个&#34; Mock&amp;认证&#34;在该对象中定义了所有这些对象的对象。然后,我可以使用不同的凭据获得这些对象中的几个,我的测试方法可以引用/使用所需的一个变体吗?

那么您对我的测试用例应用一些DRY原则的建议/建议是什么?

1 个答案:

答案 0 :(得分:3)

首先,您的设置非常大。如果这是一个单元测试,则需要重构。你确定你的被测组件只做一件事吗?根据依赖关系的名称来判断,我会假设没有。

  

接下来我想到了在班级一级确定所有内容......但是一些警告响了......如果班级为所有测试方法实例化一次,那么可能存在可变污染吗?

不,大多数测试运行器为每个测试运行创建测试类实例,单元测试框架通常允许在测试设置之前进行 ,这是一段代码(通常是方法或构造函数)。

在NUnit中,您获得了[SetUp]属性(MS Test使用[TestInitialize],而xUnit使用类构造函数):

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

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

  

如何创建一个&#34; Mock&amp;认证&#34;在该对象中定义了所有这些的对象。

虽然这对于身份验证部分来说可能是一个好主意,但对于模拟来说肯定不是这样。你甚至认为它再一次敲响重构的事实。