1

我对最小起订量和 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

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

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

如何创建一个在该对象中定义了所有这些的“模拟和身份验证”对象。然后我可以拥有几个具有不同凭据的对象,并且我的测试方法可以仅引用/使用所需的一种变体?

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

4

1 回答 1

3

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

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

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

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

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

这就是您通常解决此类问题的方式。

如何创建一个在该对象中定义了所有这些的“模拟和身份验证”对象。

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

于 2014-07-21T20:53:24.817 回答