在MVC操作方法中模拟局部变量?

时间:2012-08-06 15:42:37

标签: asp.net-mvc mocking nunit moq

使用Moq或Rhino,我想在我的一个MVC动作方法中模拟一个局部变量。

在我的程序中,我有一个'ProfileController',其方法如下:

        public ActionResult Profile(ProfileOptions oProfile)
        {
            ProfileViewModel oModel = new ProfileViewModel(); // <--can I mock this?

            //… do work, using oModel along the way

            return View(oModel);

         }

我的测试会在测试类'[SetUp]方法中创建一个新的ProfileController,并且我会使用它对其动作方法进行各种测试。

我想在我的测试中调用oModel方法时模拟上面的Profile变量,但由于它是本地的而不是通过注入传入,我可以以某种方式这样做吗?

1 个答案:

答案 0 :(得分:0)

如果你真的需要模拟对象,你可以使用在类级别声明和实例化的构造方法/类型,然后模拟该类型。

public class MyController
{
    // If you're using DI, you should use constructor injection instead of this:
    protected IProfileViewModelBuilder _builder = new ProfileViewModelBuilder();

    ...
    public ActionResult Profile(ProfileOptions oProfile)
    {
        ProfileViewModel oModel = _builder.Build(); // <--I CAN mock this!

        //… do work, using oModel along the way

        return View(oModel);

     }
    ...

}

此方法的一个好处是,如果将来ViewModel的创建变得更加复杂,则所需的任何更改都会被隔离到一个位置。

希望有所帮助,

麦克