你可以使用Moq单元测试方法而无需创建测试主题吗?

时间:2011-09-12 23:55:12

标签: c# unit-testing tdd moq

我有以下方法,它是使用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();
        }
    }

UPDATE:以下是相同的方法,不需要额外的测试主题类:

        [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 个答案:

答案 0 :(得分:3)

尝试使用CallBase。从快速入门的Customizing Mock Behavior部分开始:

  

如果没有期望覆盖,则调用基类实现   成员(犀牛模拟中的a.k.a.“Partial Mocks”):默认为false。   (如果你在System.Web中模拟Web / Html控件,这是必需的。)

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

所以在你的代码中,

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

...

// Act
mockProductSvc.Object.Checkout();