具有属性注入的MVC3单元测试控制器

时间:2013-03-06 16:51:26

标签: c# asp.net-mvc-3 unit-testing mocking

我有一个使用属性注入的MVC3项目。在我的控制器中,我打电话给服务类。正如我所提到的,它使用属性注入(使用 unity )而不是通过构造函数解析它。我已经搜遍了所有试图找到一个单元测试的例子来解决我的控制器中的这些依赖关系但是一切似乎都指的是构造函数DI。我很沮丧。任何帮助都会很棒。

控制器示例:

  [Dependency]
  public ITrainingService trainingService { get; set; } 

  public ActionResult Index(MyTrainingView myTrainingView)
  {
    //Load all training items into view object
    myTrainingView.training = trainingService.getTraining(myTrainingView.trainingId);
    myTrainingView.videos = trainingService.getTrainingVideos(myTrainingView.trainingId);
    myTrainingView.visuals = trainingService.getTrainingVisuals(myTrainingView.trainingId);
    myTrainingView.exams = trainingService.getTrainingExams(myTrainingView.trainingId);

    return View(myTrainingView);
  }

我正在尝试在运行单元测试时解决trainingService。我找到了无数的使用构造函数依赖项来模拟和解析依赖项的示例,但在属性注入时却没有。

1 个答案:

答案 0 :(得分:1)

您不需要在单元测试中依赖统一。

这样的事情可以解决问题:

    [Test]
    public void GetTrainingById()
    {
        var mockService = MockRepository.GenerateMock<ITrainingService>();
        mockService.Stub(service => service.getTraining(123)).Return(new ImaginaryClass());

        var sut = new TrainingController();
        sut.trainingService = mockService;

        var myTrainingView = new MyTrainingView();
        sut.Index(myTrainingView);

        Assert.AreEqual(expected, myTrainingView.training);
    }

如果必须在单元测试中使用unity,则可以在测试中实例化UnityContainer并使用RegisterInstance注册要注入的对象。