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);
}
}