我想实现一个使用TDD方法的webserviceclass,它发出一堆webrequests并解释响应。我将webrequests封装在几个接口中,以便我可以轻松地嘲笑它们。当通过webserviceclass请求某个东西时,实现的方法总是返回一个包含错误对象的特定响应对象。在这个错误对象的帮助下,用户可以确定请求是否成功,以及具体的错误是什么。如何保持单元测试DRY并减少断言
编写一些测试后,我意识到,我反复了很多自己在安排阶段:
var mock = new Mock<ISomeWebservices>();
var sut = new MyWebServiceClass(mock.Object);
mock.Setup(foo=>foo.SomeRequest(someData)).Returns(@"{""user"": ""12345"",""somedata"": ""60"",""someotherdata"":""2015-09-01T12:00:00.200Z""}");
sut.SomeRequest(someData,s=> response = s);
第2行,始终是所有测试相同。总是有一个安装程序模拟它返回的东西或引发异常。根据我测试的要求,我必须设置不同的课程方法。 我试图通过使用自动混合来解决这个问题,这样我就可以为每个webrequest编写一个ICustomization,但问题是我仍然需要访问模拟以获得特定于测试的安装程序。
另一个问题是声明阶段。由于我总是从请求中获取一个错误对象,所以如果我感到不安和错误,我只会断言错误对象。
Assert.That(response.Error.Type,Is.EqualTo(ErrorInfo.ErrorType.IllegalToken));
Assert.That(response.Error.Message, Is.Not.Null);
Assert.That(response.Error.AdvisedAction, Is.Not.Null);
Assert.That(response.Error.RawData, Is.Not.Null);
所以,如果有错误,也有应该始终被填写和一些可以是错误对象的某些属性。 (如果错误是由异常触发的,异常属性应该不为空等) 据我所知,在单元测试中有几个Asserts是一个不好的习惯,所以我想尽量避免这种情况。
根据评论,有多个断言,以及重复安排的部分,我提到,并没有那么糟糕。所以我不会使用Autofixture。
编写单元测试时干燥程度并不那么重要,因为它会导致脆弱的测试http://codebetter.com/karlseguin/2009/09/12/unit-testing-do-repeat-yourself/ – juharr
我不'我认为几个断言是不好的。测试不同的,不相关的东西是不好的。但是回收一个对象并测试这些属性是否正确对我来说可以。 –
对于你的难道,你不能有类变量,并使用Setup方法来创建它吗? –