在TestMethods中使用类作用域变量是危险的

本文关键字:变量 危险 作用域 TestMethods | 更新日期: 2023-09-27 18:13:50

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

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

接下来,我考虑在类级别上对上面的所有内容进行范围界定…但是一些警铃响起了……如果类对所有测试方法实例化一次,那么是否存在变量污染的可能性?考虑到这里的小样本,这真的不会发生,但我正在努力提前思考/养成良好的习惯。

创建一个"Mock &Authentication"对象,在该对象中定义了所有这些。然后我可以有几个这些对象与不同的凭据,我的测试方法可以引用/使用只需要一个变化?

那么,对于在我的测试用例中应用一些DRY原则,您有什么建议?

在TestMethods中使用类作用域变量是危险的

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

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

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

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

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

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

创建一个"Mock &Authentication"对象,在该对象中定义了所有这些。

虽然这对于身份验证部分来说可能是个好主意,但对于mock来说肯定不太合适。事实上,你甚至认为它再次敲响了重构的钟声。