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:モックでの呼び出しが1回期待されていましたが、0回でした:mock => mock.ValidatePurchaseOrders(It.IsAny())

構成されたセットアップ:mock => mock.ValidatePurchaseOrders(It.IsAny())、Times.Never呼び出しは実行されません。

私は何が間違っているのですか?

ノート:

  • Moq.4.0.10827

アップデート:

2番目の引数としてパラメータを追加する必要があるため、この行だと思いますが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 に答える