2010-09-27 65 views
2

如何声明在System.RuntimeType中包装了预期类型?断言MVC控制器的返回类型操作

作为一个更大的单元测试的一部分,以验证一个动作是否有正确的参数和动作过滤器分配我声称对一个填充的MethodInfo实例。当我声称违反“action.ReturnParameter”它会失败,因为它说类型是System.RunTimeType。虽然我明白这是围绕预期类型的​​包装,但我似乎无法找到一种方式来断言包装的实例是预期的类型 - 迄今为止我提出的最好方法是声明反对名字或全名,但这很糟糕,因为它只是使用“魔术弦”。

任何人都可以帮忙吗?由于我的谷歌搜索没有发现任何有用的东西,我猜这是一个非常简单的解决方案,我只是没有看到它。

的代码如下:

[TestMethod] 
public void CheckActionFilterSet() 
{ 
    MethodInfo action = new CustomerController((new MockHttpContext()).Object) 
           .GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance) 
           .Where(mi => mi.Name.Equals("Search")).First(); 
    Assert.That(action.ReturnParameter.ParameterType, Is.InstanceOf(typeof(ViewResult)), "View Result should be of expected type"); 
} 

异常消息是:

查看结果应该是预期类型的​​

预期:

<的System.Web的实例.Mvc.ViewResult >

却被:

<System.RuntimeType>

回答

3

只要打电话给控制器方法,并检查返回的对象的类型:

var result = new CustomerController((new MockHttpContext()).Object).Search(....); 

Assert.That(result, Is.InstanceOf(typeof(ViewResult)), "View Result should be of expected type"); 

您还可以检查值的ViewData /模型,如果你想...

+0

是的,这将是我曾经这样做的方式。我只是希望有一种方法可以将它从methodInfo的已填充实例上去掉,因为它似乎在该测试中表现得更好。然后,我不必担心在测试通话本身的功能时检查返回类型。 – 2010-09-27 14:52:53

+1

但是,您不能静态检查运行时返回的对象的类型。你只检查方法声明的返回类型。例如,返回类型为ActionResult的方法在用户未登录时可能会返回一个视图(ViewResult)或一个RedirectToRouteResult实例。您的测试应该测试这个。 – 2010-09-27 15:09:33

+0

当然,这很有道理。谢谢 – 2010-09-27 15:52:04