我正在尝试创建一个接受testdelegate或delegate并将参数传递给委托对象的方法。这是因为我正在为控制器中的方法创建测试,这些方法都采用相同的参数(id),并且我不想为所有控制器方法创建测试。
我的代码:
protected void AssertThrows_NullReference_Og_InvalidOperation(TestDelegate delegateMethod)
{
Assert.Throws<NullReferenceException>(delegateMethod);
Assert.Throws<InvalidOperationException>(delegateMethod);
Assert.Throws<InvalidOperationException>(delegateMethod);
}
我想做什么:
protected void AssertThrows_NullReference_Og_InvalidOperation(TestDelegate delegateMethod)
{
Assert.Throws<NullReferenceException>(delegateMethod(null));
Assert.Throws<InvalidOperationException>(delegateMethod(string.Empty));
Assert.Throws<InvalidOperationException>(delegateMethod(" "));
}
编辑: 我忘了提到控制器有一个返回值。因此无法使用Action。
答案 0 :(得分:13)
使用Action<string>
传递接受单个字符串参数的方法。使用您的测试参数调用该操作:
protected void AssertThrowsNullReferenceOrInvalidOperation(Action<string> action)
{
Assert.Throws<NullReferenceException>(() => action(null));
Assert.Throws<InvalidOperationException>(() => action(String.Empty));
Assert.Throws<InvalidOperationException>(() => action(" "));
}
用法:
[Test]
public void Test1()
{
var controller = new FooController();
AssertThrowsNullReferenceOrInvalidOperation(controller.ActionName);
}
更新:
对返回ActionResult的控制器使用Func<string, ActionResult>
。您也可以为此创建通用方法。
答案 1 :(得分:2)
如编辑中所述,控制器具有返回类型。因此,我不得不从Action更改为Func,因为我在单元测试中使用它,我必须创建一个保存函数的临时对象。
根据lazyberezovsky的回答,这是我的结果代码:
public class BaseClass
{
protected Func<string, ActionResult> tempFunction;
public virtual void AssertThrowsNullReferenceOrInvalidOperation()
{
if (tempFunction != null)
{
Assert.Throws<NullReferenceException>(() => tempFunction(null));
Assert.Throws<InvalidOperationException>(() => tempFunction(string.Empty));
Assert.Throws<InvalidOperationException>(() => tempFunction(" "));
}
}
}
单元测试是:
[TestFixture]
public class TestClass
{
[Test]
public override void AssertThrowsNullReferenceOrInvalidOperation()
{
tempFunction = Controller.TestMethod;
base.AssertThrowsNullReferenceOrInvalidOperation();
}
}