我对asp.net mvc3应用程序的UnitTests有一点问题。
如果我在Visual Studio 2010 专业版中运行某些单元测试,则它们已成功通过。
如果我使用Visual Studio 2010 Professional命令行
mstest /testcontainer:MyDLL.dll /detail:errormessage /resultsfile:"D:\A Folder\res.trx"
然后发生了错误:
[errormessage] = Test method MyDLL.AController.IndexTest threw exception:
System.NullReferenceException: Object reference not set to an instance of an object.
和我的控制器:
public ActionResult Index(){
RedirectToAction("AnotherView");
}
并在测试
中AController myController = new AController();
var result = (RedirectToRouteResult)myController.Index();
Assert.AreEqual("AnotherView", result.RouteValues["action"]);
如何在两种情况下(VS2010和mstest.exe)解决此问题?
谢谢
PS:我读过Test run errors with MSTest in VS2010但如果我有VS2010 Ultimate / Premium可以解决这个问题。
答案 0 :(得分:0)
我发现了问题。问题是AnotherView
行动。
行动AnotherView
包含
private AModel _aModel;
public ActionResult AnotherView(){
// call here the function which connect to a model and this connect to a DB
_aModel.GetList();
return View("AnotherView", _aModel);
}
需要做什么:
1.使用类似
的参数创建控制器构造函数public AController(AModel model){
_aModel = model;
}
2.在测试或单元测试类中,创建一个类似
的模拟public class MockClass: AModel
{
public bool GetList(){ //overload this method
return true;
}
// put another function(s) which use(s) another connection to DB
}
3.在当前测试方法IndexTest
中[TestMethod]
public void IndexTest(){
AController myController = new AController(new MockClass());
var result = (RedirectToRouteResult)myController.Index();
Assert.AreEqual("AnotherView", result.RouteValues["action"]);
}
现在单元测试将起作用。不适用于集成测试。在那里,您必须提供与DB的连接的配置,并且不应用模拟,只需使用我的问题中的代码。
希望在研究5-6小时后获得此帮助:)