2012-02-08 5 views
4

私は単項式テストを書いて解析エラーをチェックしようとしています。私はファイルからデータをストリーミングして解析し、解析結果をyield returnで返し、それをデータレイヤーに渡して一括挿入します。Rhino Mockからyield returnを実行する

データレイヤーへの呼び出しを欺くのに問題があります。それは嘲笑されているので、実際にはyield yieldから値を列挙することはないので、私の解析メソッドは決して実行されません。

私は明らかにうまくいかないようなものを試しました。 whileループ内から呼び出されているのを必要とせず - それが孤立してテストしたユニットとすることができるので、一つの最適解は、別の方法で「//魔法を行う」で起こるものを置くことであろう

[TestMethod]   
[ExpectedException(typeof(ApplicationException))] 
public void ProcessFile_InvalidInput_ThrowsException() 
{ 
    var mock = new MockRepository(); 

    var stream = new MemoryStream(); 
    var streamWriter = new StreamWriter(stream);     
    streamWriter.WriteLine("\\:fail"); 
    streamWriter.Flush(); 
    stream.Position = 0; 

    var datamanager = mock.Stub<IDataManager>();       
    TestContainer.RegisterInstance(datamanager); 

    var repos = new ProcessingRepository(); 
    TestContainer.BuildUp(repos); 

    using (mock.Record()) 
    {       
     Expect.Call(file.InputStream).Return(stream);        
     Expect.Call(delegate() { repos.Save(new List<string>()) }).IgnoreArguments(); 
    } 
    using (mock.Playback()) 
    { 
     repos.ProcessFile(stream); 
    } 
} 

答えて

3

それはStreamReaderを処理しています。

表示されている問題は、列挙の遅延評価によるものです。あなたのテストコードのどれも実際に "物"を列挙していないので、イテレータブロックを処理するために "舞台裏で"構築された状態マシンは決して処理されません。

Parseメソッドで実際にロジックを実行するには、アイテムを列挙する必要があります。

注:これは未テストコード

あなたは(私は記録/再生のセマンティクスを使用する方法を覚えていませんので、私はAAAの構文を示しています)、この私の使用してRhino.Mocks「WhenCalled」方法を行うことができます
datamanager.Stub(d => d.Save(null)).IgnoreArguments().WhenCalled(m => int count = ((IEnumerable<string>)m.Arguments[0]).Count()); 

スタブのSaveメソッドが呼び出されると、呼び出されたメソッドに関する情報を含むパラメータ(m)が "WhenCalled"に渡されます。最初の引数(もの)をつかみ、それをIEnumerable<string>にキャストし、そのカウントを取得します。これにより、列挙可能なものの評価が強制されます。

+0

WhenCalledは私が探していたものでした。ありがとう! – bmancini

関連する問題