在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原则,您有什么建议?
首先,您的设置非常大。如果这是一个单元测试,则需要进行重构。你确定你的被测组件只做一件事吗?根据依赖项的名称判断,我认为没有。
不,大多数测试运行器在每次测试运行时创建测试类实例,单元测试框架通常允许在测试设置之前使用,这是一段代码(通常是方法或构造函数)。接下来,我考虑在类级别上对上面的所有内容进行范围界定…但是一些警铃响起了……如果类对所有测试方法实例化一次,那么是否存在变量污染的可能性?
在NUnit你得到了[SetUp]
属性(MS测试使用[TestInitialize]
而xUnit使用类构造函数):
[SetUp]
public void InitializeDependencies()
{
serviceMock = new Mock<IOrganizationService>();
// ...
}
这是你通常解决这类问题的方法。
创建一个"Mock &Authentication"对象,在该对象中定义了所有这些。
虽然这对于身份验证部分来说可能是个好主意,但对于mock来说肯定不太合适。事实上,你甚至认为它再次敲响了重构的钟声。