Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何测试方法在特定输入上引发异常_C#_Asp.net Mvc_Nunit_Nsubstitute - Fatal编程技术网

C# 如何测试方法在特定输入上引发异常

C# 如何测试方法在特定输入上引发异常,c#,asp.net-mvc,nunit,nsubstitute,C#,Asp.net Mvc,Nunit,Nsubstitute,在下面的方法中,当model.test为空时,我希望此方法引发异常 public bool Create(Test model) { if (model.test == null) { throw new InvalidOperationException("nanana."); } try { return true; } catch (InvalidOperationException ex) { th

在下面的方法中,当
model.test
为空时,我希望此方法引发异常

public bool Create(Test model)
{
    if (model.test == null)
    {
        throw new InvalidOperationException("nanana.");

    }
    try
    {
        return true;
    }
    catch (InvalidOperationException ex) { throw; }
}
以下是我目前的测试:

[Test]
public void Only_one_property_should_be_set()
{
    var rep  =  Substitute.For<ITestRepository>();

    var x = rep.Create(model.ToEntity());

    Assert.Throws<InvalidOperationException>(() => rep.Create(model.ToEntity()));
}
[测试]
公共无效仅\u一个\u属性\u应该\u设置()
{
var rep=替换为();
var x=rep.Create(model.ToEntity());
Assert.Throws(()=>rep.Create(model.ToEntity());
}
它不起作用,因为x总是返回false


我可以直接替换
TestRepository
。如何使用NUnit和NSubstitute测试存储库异常,而不将项插入数据库

你所做的有几个问题。正如在评论中已经说过的,模拟/替换您试图测试的类通常是个坏主意。模拟和替换用于允许您控制通过测试代码的逻辑流,而不是替换测试代码

因为您展示的代码除了模型类之外没有任何依赖项,所以在这种情况下,您根本没有理由使用替代项。如果您的代码看起来像这样(伪代码),您将使用替代代码

在上面的代码中,
\u someDependency
是一些底层数据库交互类,通过其构造函数注入到存储库中。然后,您可以为
\u someDependency
创建一个替代项,以影响
create
方法的流程,或者验证与依赖项的交互

就目前的测试方法而言,没有理由不传入一个具有
test==null
的模型。方法中的逻辑流是这样的,如果测试失败,您就不会期望数据被写入数据库,这就是检查的重点。因此,您的测试可以简单地如下所示:

[Test]
public void CreateShouldThrowIfModelTestIsNull()
{
    var testModel = model.ToEntity();

    var sut  =  new TestRepository();

    testModel.test = null;

    try {
        sutCreate(testModel);
        Assert.Fail("Expected Exception");
    } catch(InvalidOperationException ex) {
        Assert.AreEqual("nanana.", ex.Message);
    }
}

你根本不是在测试你提供的代码——你在测试一个模拟。你应该模拟依赖关系(如果你真的需要的话),而不是你要测试的类。我不完全明白我必须要做什么,你能再描述一点吗?嗯,不清楚你想从什么开始。。。但是如果你要替换掉包含你要测试的方法的类,那是一个糟糕的开始。。。
[Test]
public void CreateShouldThrowIfModelTestIsNull()
{
    var testModel = model.ToEntity();

    var sut  =  new TestRepository();

    testModel.test = null;

    try {
        sutCreate(testModel);
        Assert.Fail("Expected Exception");
    } catch(InvalidOperationException ex) {
        Assert.AreEqual("nanana.", ex.Message);
    }
}