2016-12-01 3 views
0
BTPhysicalAccount testerInstance = new BTPhysicalAccount(IvirtualAccounts, BTmarketIn, int); 

このクラスのメソッドをテストしたいと思います。 BTmarketInは具象クラスであり、このクラスのメソッドはテスト中のそのメソッドで使用されます。だから私は、したがって、そのメソッドを模擬するために必要な私はこれを試してみました:コンクリートクラスのメソッドの部分的な模倣

 var readerAsk = Substitute.ForPartsOf<BTMarketInfo>(); 
     readerAsk.When(x => x.GetAskPrice(Arg.Any<SymbolType>())).DoNotCallBase(); 
     readerAsk.GetAskPrice(Arg.Any<SymbolType>()).Returns(2000); 
     readerAsk.When(x => x.GetBidPrice(Arg.Any<SymbolType>())).DoNotCallBase(); 
     readerAsk.GetBidPrice(Arg.Any<SymbolType>()).Returns(2000); 

がnull例外エラーを投げ維持し、いくつかの研究の後、私はあなたが非仮想メソッドを模擬することができないことに気づきました。 私はそのBTMarketInクラスIMarketInfoのインターフェイスクラスを持っています。今私はこのインターフェイスのインスタンスを模擬することができますが、私はBTMarketInのインスタンスがコンストラクタの引数として渡す必要があります。この問題を解決するにはどうすればよいですか?

+0

は、あなたは、あなたが参照しているものは何でもコンストラクタに 'IMarketInfo'を渡すようにリファクタリングすることはできますか?現在、 'BTMarketInfo'のように聞こえ、あなたがテストしているクラスは緊密に結合されています。ターゲットクラスをリファクタリングして 'IMarketInfo'を' BTMarketInfo'ではなくコンストラクタに入れることができれば、より良い形になります。 – wablab

+0

ノーリファクタリングはオプションではありません。そうでなければ、単純にメソッドを仮想化して模擬することができます。他の方法はありませんか? –

+0

Microsoft Fakes Shims(https://msdn.microsoft.com/en-us/library/hh549175.aspx#shims)を使用できます。私はそれらの経験がありませんが、これは彼らが意図しているユースケースだと思います。 – wablab

答えて

関連する問題