0

moq で非常に奇妙な動作に遭遇しましたが、それがバグなのか、何か間違ったことをしているのか理解できません。次に例を示します。

List<CustomerDataTransaction> transactions0 = GetTransactionsSomehow();
List<CustomerDataTransaction> transactions1 = GetTransactionsSomehow();

var portfolioTransactions0 = new List<IPortfolioTransaction>();
var portfolioTransactions1 = new List<IPortfolioTransaction>();

m_TransactionMapperMock
    .Setup(m => m.CreatePortfolioTransactions(transactions0))
    .Returns(portfolioTransactions0);

m_TransactionMapperMock
    .Setup(m => m.CreatePortfolioTransactions(transactions1))
    .Returns(portfolioTransactions1);

transaction0がtransaction1と等しくないことを確認したので、確かに異なるリストです。しかし、モックは異なるパラメーター (transactions0 と transactions1) で呼び出されると、portfolioTransactions1 を 2 回返します。何が悪いのか調べてみましたが、理由がわかりませんでした。次に、各リストにダミー要素を追加しました。これで修正され、モックは計画どおりに異なる値を返し始めました。これはモックのバグですか、それとも何かわかりませんか? 私が理解している限り、リスト内の値はまったく影響しないはずです。

PS重要かどうかはわかりませんが、メソッドは受け入れますIEnumerable<CustomerDataTransaction>

4

2 に答える 2

0

It.Is を使用してテストを満足させる NinjaNye の回答を拡張すると、等値演算子ではなく、オブジェクトの正確なインスタンスを見ていることが保証されるためです。

テスト フレームワークで、Assert.NotEqual を指定して 2 つのオブジェクトを指定すると、等価演算子が使用され、一方の空のリストがもう一方のリストと等しいことを示します。objectA.Property1 を objectA.Property2 と比較できると考えてください。Assert.Equal が値のインスタンスではなく、値を参照することは理にかなっています。

Xunit はメソッド Assert.Same を提供します。これは Moq の It.Is<> と同じ機能を提供し、それがオブジェクトの同じインスタンスであることを確認します。今日の一般的なテスト フレームワークのほとんどは、同様の動作を提供すると思います。

于 2013-04-13T14:45:21.570 に答える
0

試すことを検討してください:

It.Is<IEnumerable<CustomerDataTransaction>>(t => t == transactions1))

記憶から、Moq は参照の等価性を使用していると思いました

于 2013-04-12T11:05:19.017 に答える