Moq:调用验证抽象类上的受保护方法

时间:2012-05-09 16:03:29

标签: c#-4.0 methods tdd moq verify

这是我的测试

[TestClass]
public class RepositoryTests
{
    private APurchaseOrderRepository _repository;

    [TestInitialize]
    public void TestInitialize()
    {
        _repository = new FakePurchaseOrderRepository();
    }

    [TestMethod]
    public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders()
    {
        var store = new Store();
        var mockRepo = new Mock<APurchaseOrderRepository>();
        mockRepo.Protected().Setup("ValidatePurchaseOrders", ItExpr.IsAny<List<PurchaseOrder>>());

        _repository.GetPurchaseOrders(store);

        mockRepo.Protected().Verify("ValidatePurchaseOrders", Times.Once(), ItExpr.IsAny<List<PurchaseOrder>>());
    } 
}

APurchaseOrderRepository和它的界面看起来像这样

public interface IPurchaseOrderRepository
{
    List<PurchaseOrder> GetPurchaseOrders(Store store);
}

public abstract class APurchaseOrderRepository : IPurchaseOrderRepository
{
    public abstract List<PurchaseOrder> GetPurchaseOrders(Store store);

    protected virtual bool ValidatePurchaseOrders(List<PurchaseOrder> purchaseOrders)
    {
        return true;
    }
}

我的假装

public class FakePurchaseOrderRepository : APurchaseOrderRepository
{
    public override List<PurchaseOrder> GetPurchaseOrders(Store store)
    {
        var purchaseOrders = new List<PurchaseOrder>();

        ValidatePurchaseOrders(purchaseOrders);

        return purchaseOrders;
    }
}

但是,我的测试失败了:

  

测试方法   PreSwapTests.RepositoryTests.RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders   抛出异常:Moq.MockException:模拟上的预期调用   一次,但是0次:mock =&gt;   mock.ValidatePurchaseOrders(It.IsAny())

     

已配置的设置:mock =&gt;   mock.ValidatePurchaseOrders(It.IsAny()),Times.Never No   调用。

我做错了什么?

注意:

  • Moq.4.0.10827

更新

我认为这是mockRepo.Protected().Setup("ValidatePurchaseOrders");这一行,因为我需要将参数作为第二个参数添加到它,但我似乎无法将其正确。

更新2: 做了一些修改,现在它编译,但没有正确计数......或者其他什么,错误信息和代码都在上面更新。

2 个答案:

答案 0 :(得分:1)

意识到我做错了,改变了我的对象以使用这个测试

    [TestMethod]
    public void RepositoryGetPurchaseOrdersForStoreCallsValidatePurchaseOrders()
    {
        var store = new Store();

        var mockPurchaseOrderProvider = new Mock<IPurchaseOrderProvider>();
        var mockPurchaseOrderValidator = new Mock<IPurchaseOrderValidator>();
        var purchaseOrderRepository = new PurchaseOrderRepository(mockPurchaseOrderProvider.Object, mockPurchaseOrderValidator.Object);

        mockPurchaseOrderValidator.Setup(x => x.ValidatePurchaseOrders(It.IsAny<List<PurchaseOrder>>()));

        purchaseOrderRepository.GetPurchaseOrders(store);

        mockPurchaseOrderValidator.Verify(x => x.ValidatePurchaseOrders(It.IsAny<List<PurchaseOrder>>()), Times.Once());
    }

现在我认为这是一个更好的结构。

答案 1 :(得分:0)

这是因为ValidatePurchaseOrders界面中没有IPurchaseOrderRepository

存储库被声明为private IPurchaseOrderRepository _repository;,因此它只能看到界面中的内容。