好的,我被问到这个问题:
鉴于此课程
public class ModelWrapper
{
private Customer _customer; // Entity Framework POCO model
public ModelWrapper(Customer model)
{
if (model == null)
throw new ArgumentNullException("model");
_customer = model;
}
}
使用Moq编写单元测试进行测试传入null参数时抛出ArugmentNullException。注意:您不需要 实现一个接口
好的,所以我认为可以在xUnit中使用这样的东西:
[Fact]
public void ShouldTestArgumentNullException()
{
var test = Assert.Throws<ArgumentNullException>(
new ModelWrapper(null)
);
Assert.Equal(test.ParamName,"model");
}
尽管这有效,但这不是正确的答案。然后我尝试了这个:
_mock.Setup( w => new ModelWrapper(null)).Throws(new ArgumentNullException("model"));
_mock.Verify();
那个DID不起作用,我得到了这个例外:
消息:System.ArgumentException:Expression不是方法调用:w =&gt;新的ModelWrapper(null)
那么,正确的答案是什么?
编辑更新:我被告知我可以在Moq中使用一个具体的类,如下所示:
var _mock = new Mock<ModelWrapper>();
但是,我仍然没有看到如何做到这一点。正如您所看到的,我使用具体类ModelWrapper编写代码时,它仍然失败。
答案 0 :(得分:6)
这是一个非常好的测试,仅使用Visual Studio为我们提供的内容:
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ModelWrapperThrowsOnNullModel()
{
new ModelWrapper(null);
}
您现在可以添加各种第三方库,但猜测您未来的潜在雇主可能希望看到的内容超出了技术专业知识的范围。没有理由模仿任何东西,因此需要使用Moq(或类似的库)来完成这项任务是一种人为的要求,只存在于访问者的头脑中。
答案 1 :(得分:0)
我同意在这里使用Moq是完全没有必要的,并且与nvoigt的回答是一致的。
那就是说,鉴于他们希望你使用moq,它仍然可以完成,这对我来说更像是黑客攻击。
[TestClass]
public class MoqVerifyExceptionWithoutInterface {
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ModelWrapperThrowsOnNullModel() {
var mock = new Mock<ModelWrapper>(MockBehavior.Strict, null);
try {
var model = mock.Object;
} catch (TargetInvocationException e) {
if (e.InnerException != null)
throw e.InnerException;
throw;
}
}
public class ModelWrapper {
private Customer _customer;
public ModelWrapper(Customer model) {
if (model == null)
throw new ArgumentNullException("model");
_customer = model;
}
}
public class Customer { }
}