Можете ли вы провести модульное тестирование метода с использованием Moq, не создавая предмет для теста? - PullRequest
1 голос
/ 13 сентября 2011

У меня есть метод ниже, который является простым модульным тестом для метода, использующего Moq. Если мое понимание правильное, я должен создать класс ProductServiceTestSubject для предоставления объекта тестирования. Я экспериментировал с Moq только около часа, так что, может быть, я упускаю из виду функциональность. Есть ли способ, которым я смог бы достичь того же, что и ниже без необходимости создания дополнительного класса испытуемого?

    [TestMethod]
    public void CheckoutWithDiscountCallsTheDiscountAction()
    {
        // Arrange
        Mock<ProductService> mockProductSvc = new Mock<ProductService>();

        mockProductSvc.SetupGet(p => p.IsDiscounted).Returns(true);
        mockProductSvc.Setup(p => p.DoDiscountAction()).Verifiable();

        // Act
        ProductServiceTestSubject.Checkout(mockProductSvc.Object);

        // Assert
        mockProductSvc.Verify();
    }

    public class ProductServiceTestSubject
    {
        public static void Checkout(IProductService productService)
        {
            productService.Checkout();
        }
    }

ОБНОВЛЕНИЕ: Вот тот же метод без требования дополнительного класса испытуемого:

        [TestMethod]
    public void CheckoutWithDiscountCallsTheDiscountAction()
    {
        // Arrange
        Mock<ProductService> mockProductSvc = new Mock<ProductService>() { CallBase = true };

        mockProductSvc.SetupGet(p => p.IsDiscounted).Returns(true);
        mockProductSvc.Setup(p => p.DoDiscountAction()).Verifiable();

        // Act
        mockProductSvc.Object.Checkout();

        // Assert
        mockProductSvc.Verify();
    }

1 Ответ

3 голосов
/ 13 сентября 2011

Попробуйте использовать CallBase.Из раздела Настройка Mock Behavior быстрого запуска:

Вызвать реализацию базового класса, если ожидание не переопределяет члена (он же «Partial Mocks» в Rhino Mocks): по умолчанию false,(это необходимо, если вы издеваетесь над элементами управления Web / Html в System.Web!)

var mock = new Mock<IFoo> { CallBase = true };

Так в вашем коде

// Arrange
Mock<ProductService> mockProductSvc = new Mock<ProductService> { CallBase = true };

...

// Act
mockProductSvc.Object.Checkout();
...