3

这是我的测试

[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 次:模拟 => 模拟.ValidatePurchaseOrders(It.IsAny())

配置的设置:mock => mock.ValidatePurchaseOrders(It.IsAny()), Times.Never 没有执行调用。

我究竟做错了什么?

笔记:

  • 最小起订量 4.0.10827

更新:

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

更新 2:进行了一些修改,现在它可以编译了,但计数不正确......或者其他东西,错误消息和代码都在上面更新了。

4

2 回答 2

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());
    }

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

于 2012-05-09T17:14:21.583 回答
0

这是因为ValidatePurchaseOrders不在您的IPurchaseOrderRepository界面中。

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

于 2012-05-09T16:09:17.183 回答