您可以使用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();
}
尝试使用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();