Как правильно протестировать метод с типом возврата перечисления, используя justmock / moq

#unit-testing #enums #mocking #moq #justmock

#модульное тестирование #перечисления #издевательство #moq #justmock

Вопрос:

В настоящее время у меня возникают проблемы с тестированием метода, который использует мой контроллер, который издевается. он имеет возвращаемый тип определенного перечисления. В настоящее время я всегда возвращаю из этого издевательского метода значение enum по умолчанию, а не значение, которое я указал для его возврата. Я что-то упускаю? Я пробовал как Moq, так и JustMock lite с одинаковыми результатами. Пример JustMock lite ниже.

Надеюсь, я не допустил никаких ошибок при копировании кода, я изменил все имена объектов, поэтому приношу извинения за это.

Вот часть модульного теста:

         var returnStatus = ExampleEnum.Invalid;

        //Mock the client
        var client = Mock.Create<ITestInterface>();

        Mock.Arrange(() => client.ValidateSomething(Guid.NewGuid()))
            .Returns(returnStatus).MustBeCalled();


        var testController = new TestController(client);

        var result = testController.DoSomething(Guid.NewGuid().ToString()) as ViewResu<
  

Вот соответствующие биты от контроллера:

         private ITestInterface _client { get; set; }

        public TestController(ITestInterface client)
        {
            _client = client;
        }
  

Вот часть моего действия контроллера:

  public ActionResult DoSomething(string id)
        {
            Guid token;
            if(!string.IsNullOrEmpty(id) amp;amp; Guid.TryParse(id, out token))
            {
                using (var client = _client)
                {
                    ApplicationUser applicationUser;
                    var status = client.ValidateSomething(token);

                    switch (status)
                    {
  

Клиент издевается правильно, но возвращаемое свойство «status» всегда является ExampleEnum.defaultValue не то значение, которое я указал в качестве результата.

Надеюсь, я предоставил достаточно информации. Любая помощь приветствуется.

Ответ №1:

Вероятно, вы неправильно выполнили настройку.

Guid.NewGuid() возвращает новый случайный идентификатор GUID, поэтому идентификатор GUID, который вы используете для настройки своего макета, и идентификатор GUID, который вы используете для вызова DoSomething метода, никогда не будут одинаковыми.

Вы должны сделать что-то вроде:

 var guid = Guid.NewGuid()
...
Mock.Arrange(() => client.ValidateSomething(guid))
        .Returns(returnStatus).MustBeCalled();
...
var result = testController.DoSomething(guid.ToString()) as ViewResu<
  

используя один и тот же идентификатор GUID для макета и для вызова DoSomething .


Я не знаю о JustMock, но с Moq вы также можете просто использовать It.IsAny для сопоставления всех идентификаторов GUID:

 client.Setup(c => c.ValidateSomething(It.IsAny<Guid>())).Returns(returnStatus);
  

Комментарии:

1. Большое спасибо, это сработало. Я думал, что проблема связана с перечислением, а не с настройкой самого макета. Таким образом, при компоновке макета значение, заданное в возвратах, будет возвращено только в том случае, если значение совпадает со значением, переданным в doSomething, если вы не сделаете то, что вы упомянули с Moq, чтобы соответствовать всем идентификаторам guid.

2. @DanHead Да (я не знаю о JustMock, но я предполагаю, что это то же поведение, что и Moq).