【问题标题】:Can you Unit Test a method using Moq without having to create a test subject?您可以使用 Moq 对方法进行单元测试而无需创建测试主题吗?
【发布时间】:2011-09-12 23:55:11
【问题描述】:

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

【问题讨论】:

    标签: c# unit-testing tdd moq


    【解决方案1】:

    尝试使用CallBase。来自快速入门的Customizing Mock Behavior 部分:

    如果没有期望覆盖 成员(在 Rhino Mocks 中也称为“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();
    

    【讨论】:

      猜你喜欢
      • 2012-06-01
      • 2021-10-15
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2020-09-06
      相关资源
      最近更新 更多