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