9

我正在尝试创建一个采用 testdelegate 或委托并将参数传递给委托对象的方法。这是因为我正在为所有采用相同参数(一个 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。

4

2 回答 2

14

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

更新:

用于Func<string, ActionResult>返回 ActionResult 的控制器。您也可以为此目的创建通用方法。

于 2013-01-02T09:51:46.747 回答
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();
        }
}
于 2013-01-02T11:19:27.203 回答