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

本文关键字:测试 创建 可以使 Moq 单元 测试方法 | 更新日期: 2023-09-27 18:08:18

我有下面的方法,这是一个简单的单元测试的方法使用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();
    }

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

尝试使用CallBase。从快速入门的自定义模拟行为部分:

如果没有期望覆盖基类实现,则调用基类实现成员(或称。"Partial Mocks" (Rhino 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();