3

我对 asp.net mvc3 应用程序的 UnitTests 有一点问题。

如果我在 Visual Studio 2010 Professional中运行一些单元测试,它们已经成功通过。

如果我使用 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:我在 VS2010 中使用 MSTest 阅读了测试运行错误,但如果我有 VS2010 Ultimate/Premium,这可以解决。

4

1 回答 1

1

我发现了问题。问题是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 小时后有所帮助:)

于 2012-10-12T18:34:58.833 回答