Контроллер Moq тестирует с повторной установкой

Я начинаю на платформе 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 );
}

То, что я хотел бы смочь сделать, принимают все #region и извлечение, что во вспомогательный метод или [Установку] метод, но если я делаю это, затем у меня нет доступа к каждому ложному сервису для установки ожиданий.

Есть ли что-то, что я пропускаю здесь, или у меня действительно есть к копии-и-вставке этот блок кода Расположения в каждом Модульном тесте?

5
задан MaseBase 15 July 2010 в 18:44
поделиться

1 ответ

Попробуйте использовать контекст для настройки всех ваших моков, затем используйте тестовые инструменты , которые наследуют ваш контекст. Поместите тесты в эти приспособления и виолончели! Этот код может быть не совсем подходящим для используемой вами структуры. Если это NUnit, то так и будет. Но теория есть.

public abstract class MembershipTestContext
    {
        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>();   

        [SetUp]
        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() )   
        }; 
    }

[TestFixture]
public class when_getting_sign_in : MembershipContext
{
    [Test]
    public void Should_return_view()
    {
        // Act            
        ActionResult result = controller.SignIn();

        // Assert            
        Assert.IsInstanceOf<ViewResult>(result);
    }

   [Test]
    public void Should_do_another_test()
    {
        ... another test etc
    }
}
3
ответ дан 15 December 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: