MOQ - проверка исключения была выбрана

Я работаю с базой MOQ для тестирования. У меня есть сценарий, в котором я ожидаю, что будет вызвано исключение ошибки. Как я могу проверить, что он был брошен?

public void Koko(List<string?> list) 
{ 
   foreach(string? str in list) 
   { 
        if (str != null) someProperty.Foo(str); 
        else throw new FormatException(); 
   } 
} 

Спасибо заранее.

Ответ 1

Если вы хотите проверить, что было создано исключение (по вашему собственному коду), то Moq не является вашим инструментом выбора для этого. Просто используйте одну из доступных фреймов unit test.

XUnit/NUnit

Assert.Throws<SomeException>(() => foo.Bar());

Свободные утверждения

Action act = () => foo.Bar());
act.ShouldThrow<SomeException>()

http://fluentassertions.codeplex.com/documentation

http://www.nunit.org/index.php?p=exceptionAsserts&r=2.6.2

Ответ 2

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

Похоже, у вас есть класс с методом Foo, который берет строку - позволяет называть этот InnerClass

public class InnerClass {
    public virtual void Foo(string str) {
         // do something with the string
    }
}

и класс, который содержит InnerClass как свойство (someProperty), который имеет член Koko, который принимает List <string> в качестве параметра

public class OuterClass {

    private readonly InnerClass someProperty;

    public OuterClass(InnerClass someProperty) {
        this.someProperty = someProperty;
    }

    public void Koko(List<string> list) {
         foreach (var str in list) {
              if (str != null)
                   someProperty.Foo(str);
              else
                   throw new FormatException();
          }
    } 
}

ПРИМЕЧАНИЕ: Я не могу получить List < string? > для компиляции - говорит мне, что базовый тип (строка) должен быть непустым. AFAIK, нужно только сделать типы значений nullable, ссылочные типы неявно обнуляются.

Похоже, вы хотите протестировать это, если вы передадите список строк, где любой из них имеет значение null, которое выбрано форматированиеException.

Если это так, то единственная причина для MOQ - освободить нас от беспокойства о функциональности InnerClass. Foo - это метод, поэтому, если мы не используем строгие mocks, мы можем просто создать макет InnerClass без каких-либо других настроек.

Существует атрибут [ExpectedException], с помощью которого мы можем пометить наш тест, чтобы убедиться, что это исключение выброшены.

[TestMethod]
[ExpectedException(typeof(FormatException))]
public void ExceptionThrown() {

    var list = new List<string>() {
        "Abel",
        "Baker",
        null,
        "Charlie"
    };

    var outer = new OuterClass(new Mock<InnerClass>().Object);
    outer.Koko(list);

}

Этот тест пройдет, если выбрано форматированиеException и сбой, если это не так.

Ответ 3

Вы можете проверить, что исключение выбрано с помощью NUnit Asserts:

Assert.That(() => testObject.methodToTest(), Throws.TypeOf<FaultException>());

Ответ 4

Прочтите это Введение в Moq. Вот способ установки InvalidOperationException металирования при вызове метода DoSomething:

mock.Setup(foo => foo.DoSomething()).Throws<InvalidOperationException>();

Затем просто проверьте, вызван ли метод. Если он был вызван, то исключение было поднято

mock.Verify(foo => foo.DoSomething());

Ответ 5

Старый вопрос, но исходный код на самом деле не показывает, что такое решение, так вот что я сделал:

var correctExceptionThrown = false;

try
{
    _myClass.DoSomething(x);
}
catch (Exception ex)
{
    if (ex.Message == "Expected message")
        correctExceptionThrown = true;
}                    

Assert.IsTrue(correctExceptionThrown);

Обратите внимание, а не проверяя сообщение, вы можете поймать определенный тип исключения (обычно предпочтительнее).

Ответ 6

Итак, я решил это следующим образом.

Поскольку исключение завершило мой тест, я поместил вызов метода в блок "Потому что" в try-catch.

Тогда я мог бы использовать простой Verify.

Спасибо всем помощникам...