在NUnit中将参数传递给TestDelegate

时间:2013-01-02 09:38:24

标签: c# unit-testing delegates nunit

我正在尝试创建一个接受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。

2 个答案:

答案 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();
        }
}