采访问:使用Moq验证没有接口时抛出的异常?

Ste*_*her 0 c# unit-testing moq

好的,有人问我:

鉴于这门课程

public class ModelWrapper
{
    private Customer _customer;             // Entity Framework POCO model

    public ModelWrapper(Customer model)
    {
        if (model == null)
            throw new ArgumentNullException("model");

        _customer = model;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Moq编写单元测试来测试传入null参数时抛出ArugmentNullException.注意:您不需要实现接口

好的,所以我认为可以在xUnit中使用这样的东西:

[Fact]
public void ShouldTestArgumentNullException()
{
    var test = Assert.Throws<ArgumentNullException>(
        new ModelWrapper(null)
    );

    Assert.Equal(test.ParamName,"model");
}
Run Code Online (Sandbox Code Playgroud)

即使这有效,但这不是正确的答案.然后我尝试了这个:

_mock.Setup( w => new ModelWrapper(null)).Throws(new ArgumentNullException("model"));
_mock.Verify();
Run Code Online (Sandbox Code Playgroud)

这不行,我得到了这个例外:

消息:System.ArgumentException:Expression不是方法调用:w => new ModelWrapper(null)

那么,正确的答案是什么?

编辑更新:有人告诉我,我只能在Moq使用一个具体的类,如下所示:

 var _mock = new Mock<ModelWrapper>(); 
Run Code Online (Sandbox Code Playgroud)

但是,我仍然没有看到如何做到这一点.正如您在使用具体类ModelWrapper编写代码时所看到的那样,它仍然失败了.

nvo*_*igt 6

这是一个非常好的测试,仅使用Visual Studio为我们提供的内容:

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void ModelWrapperThrowsOnNullModel() 
{
    new ModelWrapper(null);
}
Run Code Online (Sandbox Code Playgroud)

您现在可以添加各种第三方库,但猜测您未来的潜在雇主可能希望看到的内容超出了技术专业知识的范围.没有理由模仿任何东西,因此需要使用Moq(或类似的库)来执行此任务是一种人为的要求,只存在于面试官的头脑中.