Насмешки носорога - тупик.Expect по сравнению с.AssertWasCalled

Суть Swagger в том, что он использует сигнатуры вашего метода для генерации документации о том, как работает ваш код. Обход всех нормальных веб-API и выбор чтения необработанного HTTP-запроса означает, что Swagger не может видеть, что вы делаете, что затрудняет автоматическое определение того, что делает ваш код. Техника, которую вы используете для чтения необработанного запроса и использования динамического, имеет ряд других недостатков.

  • Вы не получаете Intellisense для своих объектов
  • Это не функционально , то есть сложнее сказать, посмотрев на метод, что он принимает как ввод и вывод, что делает это труднее понять
  • Труднее провести модульное тестирование вашего кода, потому что теперь вам нужно создать HTTP-запрос для вашего контроллера Web API
  • Для него требуется больше кода, чем для работы с правильными объектами [ 117]

Вместо этого мы должны определить подходящую модель для публикации в нашем API. Это позволит Web API выполнять свою работу, механизм связывания будет обрабатывать преобразование запроса в экземпляр CreateAccountRequest.

public class CreateAccountRequest
{
    public string Email { get; set; }

    public string Name { get; set; }

    public string Domain { get; set; }
}

Тогда мы можем заставить наш метод действия взять этот экземпляр этого класса в качестве параметра.

[HttpPost]
[ActionName("create-account")]
public IHttpActionResult CreateAccount(CreateAccountRequest request)
{
    //now here you can validate the request if you want
}

Swagger должен быть в состоянии понять этот метод сейчас, что позволяет NSwag генерировать полезного клиента.

Обратите внимание, что вместо пользовательской проверки C # вы должны изучить встроенные инструменты, которые Web API предоставляет для проверки модели . Тогда все, что вам нужно сделать, это проверить ModelState, а не проверять вручную каждый параметр. Другие инструменты также могут посмотреть на атрибуты ваших моделей, улучшая их опыт.

34
задан Raedwald 1 March 2019 в 14:36
поделиться

3 ответа

Какой твой тест пытается достичь?

Какое поведение или состояние вы проверяете? В частности, вы проверяете, что Collaborator (Data) имеет его ListCount метод, называемый методом (тестирование на основе взаимодействия), или вы просто хотите сделать ListCount Вернуть консервированное значение для привода Класс под тестом при проверке результата в других местах (традиционное государственное тестирование)?

Если вы хотите установить ожидание, используйте макет и ожидание: Использование Mockrepository. CreateMock () и mymock.expect (x => x.listcount ())

Если вы хотите заглушить метод, используйте Mockreposity .CreateStub () и MyStub.stub (x => x.listcount ()) .

.

Рой Осеров имеет очень хорошее объяснение издевателей и заглушек.

Пожалуйста, напишите еще код!

Нам нужна полная картина того, как вы создаете заглушку (или издевательства) и как результат используется по сравнению с тестом класса. ListCount имеет входной параметр? Если это так, что он представляет? Вы заботитесь, если это было , называется определенным значением? Вы заботитесь, если ListCount возвращает определенное значение?

Как отметил Саймон Лароче, если менеджер на самом деле не делает ничего, с издевательством / неподвижным возвращающим значение ListCount, то тест не пройдет или не пройдет из-за этого. Весь тест ожидал, что издевался / неподвижный метод называется - не более.

Чтобы лучше понять проблему, рассмотрите три части информации, и вы скоро поймете это:

  1. Что тестируются
  2. в какой ситуации?
  3. Что такое ожидаемый результат?

Сравнить: Тестирование на основе взаимодействия с помощью издеваний . Вызов на макет тест.

[Test]
public void calling_ListCount_calls_ListCount_on_DAL()
{
   // Arrange
   var dalMock = MockRepository.Mock<IDAL>();
   var dalMock.Expect(x => x.ListCount()).Returns(1);
   var manager = new Manager(dalMock);

   // Act
   manager.ListCount();

   // Assert -- Test is 100% interaction based
   dalMock.VerifyAllExpectations();   
}

Состояние на основе тестирования с заглушкой . Ступень управляет тестом, но не является частью ожидания.

[Test]
public void calling_ListCount_returns_same_count_as_DAL()
{
   // Arrange
   var dalStub = MockRepository.Stub<IDAL>();
   var dalStub.Stub(x => x.ListCount()).Returns(1);
   var manager = new Manager(dalMock);

   // Act
   int listCount = manager.ListCount();

   // Assert -- Test is 100% state based
   Assert.That(listCount, Is.EqualTo(1),
       "count should've been identical to the one returned by the dal!");
}

Я лично оказываю на основе государственных тестирование, где вообще возможно, хотя тестирование на основе взаимодействия часто требуется для API, разработанных с , не просим в виду, так как у вас не будет открытое состояние, чтобы проверить против!

Путаница API. Макеты не заглушки. Или они?

Различие между издевательствами и заглушкой в ​​носовых макетах запутывается. Традиционно заглушки не должны иметь ожидания - поэтому, если ваш тест дважды не имел его метода, это не приведет к неудачному тесту.

... Тем не менее, API Rhino Models мощный, но сбивает с толку, как оно позволяет вам ставить ожидания на заглушки, которые, для меня, идет против принятой терминологии. Я не думаю, что большая часть терминологии, либо ума. Было бы лучше, если бы различие было устранено, и методы вызвали тест двойной, на мой взгляд, на мой взгляд.

53
ответ дан 27 November 2019 в 16:55
поделиться

Я думаю, что это имеет отношение что Ваш менеджер. ListCount () делает с возвращаемым значением.

, Если это не использует его затем, Ваш DAL может возвратить что-либо, что это не будет иметь значения.

public class Manager
{
    public Manager(DAL data)
    { 
        this.data = data
    }
    public void ListCount()
    {
        data.ListCount(1); //Not doing anything with return value
        DoingSomeOtherStuff();
    }    
}

, Если Ваше количество списка делает что-то со значением, что необходимо затем поставить утверждения, что оно делает. Для exemple

Assert.IsTrue(manager.SomeState == "someValue");
1
ответ дан 27 November 2019 в 16:55
поделиться

Вы пытались использовать

data.AssertWasCalled(x => x.ListCount(1) = Arg.Is(EXPECTED_VALUE));
0
ответ дан 27 November 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: