我是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原则的建议/建议是什么?
答案 0 :(得分:3)
首先,您的设置非常大。如果这是一个单元测试,则需要重构。你确定你的被测组件只做一件事吗?根据依赖关系的名称来判断,我会假设没有。
接下来我想到了在班级一级确定所有内容......但是一些警告响了......如果班级为所有测试方法实例化一次,那么可能存在可变污染吗?
不,大多数测试运行器为每个测试运行创建测试类实例,单元测试框架通常允许在测试设置之前进行 ,这是一段代码(通常是方法或构造函数)。
在NUnit中,您获得了[SetUp]
属性(MS Test使用[TestInitialize]
,而xUnit使用类构造函数):
[SetUp]
public void InitializeDependencies()
{
serviceMock = new Mock<IOrganizationService>();
// ...
}
这就是你通常解决这类问题的方法。
如何创建一个&#34; Mock&amp;认证&#34;在该对象中定义了所有这些的对象。
虽然这对于身份验证部分来说可能是一个好主意,但对于模拟来说肯定不是这样。你甚至认为它再一次敲响重构的事实。