Я пытаюсь внедрить webserviceclass с использованием подхода TDD, который отправляет кучу веб-запросов и интерпретирует ответы. Я инкапсулировал веб-запросы в нескольких интерфейсах, чтобы я мог легко их издеваться. При запросе чего-либо через webserviceclass реализованный метод всегда возвращает конкретный объект ответа, содержащий объект ошибки. С помощью этого объекта ошибки пользователь может определить, был ли запрос успешным или нет, и какова была конкретная ошибка.Как сохранить модульные тесты DRY и уменьшить Asserts
После написания кучи тестов, я понял, что я повторял себе много в фазе Упорядочить:
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 строки всегда одинаков для всех тестов. Всегда существует программа установки для макета, которая возвращает что-то или генерирует исключение. В зависимости от того, какой запрос я тестирую, мне нужно настроить другой метод. Я попытался решить эту проблему, используя Autofixture, чтобы я мог написать ICustomization для каждого web-запроса, но проблема в том, что мне все еще нужен доступ к макету, чтобы иметь тестовую установку.
Другая проблема: Assert фаза. Поскольку я всегда получаю объект ошибки из запроса, я только утверждаю объект ошибки, если я являюсь искушением и ошибкой.
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);
Так что, если есть ошибка, есть некоторые свойства объекта ошибки, которые всегда должны быть заполнены, и некоторые из них могут быть. (т. е. если ошибка была вызвана исключением, свойство исключения должно быть не равным нулю и т. д.) Насколько я понял, наличие нескольких тестов в единичном тесте является плохой практикой, поэтому я хотел бы избежать этого, если это возможно.
[править] Согласно комментарии, имеющие множественные Утверждает, а также повторение аранжировать части I упоминает, не так уж плохо. Поэтому я не буду использовать Autofixture для этого.
Сухость не так важна при написании Unit Tests, так как это может привести к хрупким испытаниям http://codebetter.com/karlseguin/2009/09/12/unit-testing-do-repeat-yourself/ – juharr
Я не знаю, Думаю, несколько утверждений плохие. Тестирование разных, несвязанных вещей плохое. Но возвращение объекта и проверка правильности свойств для меня в порядке. –
Для вашего sut, не можете ли вы иметь переменную класса и использовать метод установки для ее создания? –