我可能误读了您的意图,但据我所知,没有必要对模拟做任何事情来测试是否引发了异常。
看起来你有一个类,它的方法 Foo 接受一个字符串 - 让我们称之为 InnerClass
public class InnerClass {
public virtual void Foo(string str) {
// do something with the string
}
}
和一个包含 InnerClass 作为属性 (someProperty) 的类,它有一个成员 Koko,它以 List 作为参数
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 编译 - 告诉我基础类型(字符串)必须是不可为空的。 AFAIK,只需要使值类型可以为空,引用类型可以隐式为空。
您似乎想测试,如果您传入一个字符串列表,其中任何一个为空,则抛出 FormatException。
如果是这样,那么 MOQ 的唯一原因就是让我们不必担心 InnerClass 功能。 Foo 是一种方法,因此,除非我们使用严格的模拟,否则我们可以只创建一个 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);
}
如果抛出 FormatException,则此测试将通过,否则将失败。