Moq控制器测试重复设置

Mas*_*ase 5 c# nunit unit-testing moq asp.net-mvc-2

我开始使用Moq框架并且非常喜欢它.我正在编写一些控制器测试,它们有几个服务和接口来安排我的控制器进行测试.我想更多地模块化它,并认为这将是一项微不足道的任务,但事实证明它比我想象的要复杂一些.

这是一个简单的单元测试,我必须展示一个例子:

[Test]
public void Get_SignIn_Should_Return_View()
{
    #region //TODO: figure out how to extract this out to avoid duplicate code
    // Arrange
    var membershipService = new Mock<IMembershipService>();
    var formsService = new Mock<IFormsAuthenticationService>();
    var userService = new Mock<IUserService>();
    var dictService = new Mock<IDictionaryService>();
    var shoppingBasketService = new Mock<IShoppingBasketService>();

    //Create the service provider mock and pass in the IRepositoryFactory so that it isn't instantiating real repositories
    var repoFactory = new Mock<IRepositoryFactory>();
    var serviceProvider = new Mock<ServiceProvider>( (IRepositoryFactory)repoFactory.Object );

    var context = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock };
    var sessionVars = new Mock<SessionVars>();

    AccountController controller = new AccountController( serviceProvider.Object, sessionVars.Object )
    {
        FormsService = formsService.Object,
        MembershipService = membershipService.Object,
        UserService = userService.Object,
        DictionaryService = dictService.Object,
        ShoppingService = shoppingBasketService.Object
    };
    controller.ControllerContext = new ControllerContext()
    {
        Controller = controller,
        RequestContext = new RequestContext( context.Object, new RouteData() )
    };
    #endregion

    // Act
    ActionResult result = controller.SignIn();

    // Assert
    Assert.IsInstanceOf<ViewResult>( result );
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做的是将所有内容都#region提取到辅助方法或[Setup]方法中,但如果我这样做,那么我就无法访问每个模拟服务来设置期望.

有没有我在这里缺少的东西,或者我真的必须在每个单元测试中复制并粘贴这一排编码?

Sco*_*ard 3

尝试使用上下文来设置所有模拟,然后使用继承上下文的测试装置。将测试放入这些装置和 viol\xc3\xa0! 此代码可能不完全适合您正在使用的框架。如果是 NUnit 那就会了。但理论就在那里。

\n\n
public abstract class MembershipTestContext\n    {\n        var membershipService = new Mock<IMembershipService>();\n        var formsService = new Mock<IFormsAuthenticationService>();\n        var userService = new Mock<IUserService>();\n        var dictService = new Mock<IDictionaryService>();\n        var shoppingBasketService = new Mock<IShoppingBasketService>(); \n\n        //Create the service provider mock and pass in the IRepositoryFactory so that it isn\'t instantiating real repositories   \n        var repoFactory = new Mock<IRepositoryFactory>();   \n        var serviceProvider = new Mock<ServiceProvider>( (IRepositoryFactory)repoFactory.Object );   \n\n        var context = new Mock<HttpContextBase> { DefaultValue = DefaultValue.Mock };   \n        var sessionVars = new Mock<SessionVars>();   \n\n        [SetUp]\n        AccountController controller = new AccountController( serviceProvider.Object, sessionVars.Object )   \n        {   \n            FormsService = formsService.Object,   \n            MembershipService = membershipService.Object,   \n            UserService = userService.Object,   \n            DictionaryService = dictService.Object,   \n            ShoppingService = shoppingBasketService.Object   \n        };   \n        controller.ControllerContext = new ControllerContext()   \n        {   \n            Controller = controller,   \n            RequestContext = new RequestContext( context.Object, new RouteData() )   \n        }; \n    }\n\n[TestFixture]\npublic class when_getting_sign_in : MembershipContext\n{\n    [Test]\n    public void Should_return_view()\n    {\n        // Act            \n        ActionResult result = controller.SignIn();\n\n        // Assert            \n        Assert.IsInstanceOf<ViewResult>(result);\n    }\n\n   [Test]\n    public void Should_do_another_test()\n    {\n        ... another test etc\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n