2012-02-05 5 views
10

Moqを使用しようとしたときに呼び出された元のメソッド。ここに私のコードです:後半のコードでMoqセットアップが機能しない、元のメソッドがまだ呼び出されています

var mockedBetRepository = new Mock<BetRepository>(new FakeSiteContext()); 
mockedBetRepository.CallBase = true; 
Bet bet = new Bet(); 
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); 

betRepository = mockedBetRepository.Object; 

betRepository.UpdateBet(bet)が呼び出されますが、呼び出されていない私のモックメソッド、代わりに、クラスのメソッドが呼び出されます:

public virtual Bet UpdateBet(Bet betToUpdate) 
{ 
    siteContext.Entry(betToUpdate).State = System.Data.EntityState.Modified; 
    siteContext.SaveChanges(); 
    return betToUpdate; 
} 

なぜ、この出来事?

答えて

8

私はこの問題を発見しました。

私はこの

mockedBetRepository.Setup<Bet>(m => m.UpdateBet(It.IsAny<Bet>())).Returns((Bet b) => b); 

Bet bet = new Bet(); 
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); 

を交換した場合、それは動作します。

+0

実際に呼び出されたときのようにメソッドをセットアップするときに同じ参照を使用していますか? Moqを使用して特定の値が検証時に使用されたかどうかをテストすることができるので、これはあなたが見ていた動作を説明するものです。参照型の場合は、オブジェクトの特定のインスタンスになります。 – Andy

+0

ええ、それはおそらくそれでした。モックがあまりにも排他的かつ明示的であることは知らなかった。 – ErikTJ

0

実際の実装を呼び出すcallbaseをtrueに設定します。

+0

はい、それは私が見ることができますが、 "それがセットアップに一致しない場合は、"基本実装を呼び出すでしょうか? – ErikTJ

+0

@ErikTJそしてCallBase = trueを使わずに試しましたか? – Andy

+0

解決策を見つけました。私の答えを見てください。 CallBase = falseを設定することはできません。なぜなら、私は多くのメソッドのうちの1つを擬似する必要があるからです。 – ErikTJ

関連する問題