单元测试 - 用户控制器的方法

时间:2013-02-27 00:16:57

标签: asp.net-mvc unit-testing controller

我有一个名为“UserController”的Controller,其方法名为“Invite”。我的控制器具有以下覆盖方法:

DBRepository _repository;
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
            _repository = new DBRepository();

}

因此,每次创建UserController类时都会调用此方法。

我的方法“邀请”有以下几行:

var startTime = _repository.Get<AllowedTime>(p => p.TimeID == selectTimeStart.Value);

但是当我尝试通过Unit方法调用此方法时:

[TestMethod()]
[UrlToTest("http://localhost:6001/")]
public void InviteTest()
{
    UserController target = new UserController(); // TODO: Initialize to an appropriate value
    int? selectTimeStart = 57;
    int? selectTimeEnd = 61;
    Nullable<int> selectAttachToMeeting = new Nullable<int>(); // TODO: Initialize to an appropriate value
    int InvitedUserID = 9; // TODO: Initialize to an appropriate value
    UserInviteModel model = new UserInviteModel();
    model.Comment = "BLA_BLA_BLA";
    ActionResult expected = null; // TODO: Initialize to an appropriate value
    ActionResult actual;
    actual = target.Invite(selectTimeStart, selectTimeEnd, selectAttachToMeeting, InvitedUserID, model);
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

我收到错误“引用未设置...”。我明白为什么会发生这种情况(_repository为null因为在我的情况下没有调用Initialize方法,但是如何正确地执行它?

1 个答案:

答案 0 :(得分:1)

如果您希望DBRepository在测试期间实际执行后备数据存储中的Get,则可以将_repository字段更改为Lazy<DBRepository>,并在首次使用时初始化。 (我假设它在Initialize方法而不是构造函数中被new编辑,因为它依赖于当前的请求上下文?)

如果您希望这是一个真正的单元测试,它根本不应该测试DBRepository类:您应该编程到可以模拟的接口。此外,您需要进行此操作,以便DBRepository来自测试用例可以提供的位置。您可以将它由工厂构建或作为单例提供,测试用例可以设置工厂或单例以提前提供模拟对象。但是,最佳方法是使用依赖注入,因此您可以在构造new UserController()时提供伪造/模拟IDBRepository。