0

メソッドでは、通常、次のようなことを行います。

string[] lines = File.ReadAllLines(filename);

テストのために、ファイル システムをモック アウトできるようにしたいのですが、SystemWrapperについて肯定的なコメントを聞いたので、このライブラリを使用したいと思います。

私が理解しているように、SystemWrapper を使用するには、インターフェイス ベースの呼び出しを行う必要があります。それはいいです。したがって、上記のコード行は次のようになります。

string[] lines = new FileWrap().ReadAllLines(filename);

今、私のテスト方法は次のようになります: (私は Microsoft.VisualStudio.TestTools.UnitTesting を Rhino Mock と組み合わせて使用​​しています)

[TestMethod()]
public void Test_this_method()
{
    IFileWrap fileWrapRepository = MockRepository.GenerateMock<IFileWrap>();
    fileWrapRepository.expect(x => x.ReadAllLines("abc.txt").Return(new string[] {"Line 1", "Line 2", "Line 3"});

    MethodThatReadsLines();
}

この例は、SystemWrapper のGetting Startedページの例を基にしています。

ただし、これを行うと、メソッドはモックされたメソッドを呼び出していません。呼び出してFile.ReadAllLinesいます。これは私が期待しているものではありません。

モックする正しい方法は何File.ReadAllLinesですか?

4

1 に答える 1

3

Moqはテストダブルです。モックを呼び出すには、他のオブジェクトではなく、実際にモックでメソッドを呼び出す必要があります。

コードでこれを行う代わりに:

string[] lines = new FileWrap().ReadAllLines(filename);

次のようなことをする必要があります:

public void MethodThatReadsLines(IFileWrap fileReader) {
    string[] lines = fileReader.ReadAllLines(filename);
}

そうすれば、テストからモック オブジェクトを挿入でき、現在使用している新しく作成されたインスタンスではなく、実稼働コードで使用されます。

[TestMethod()]
public void Test_this_method()
{
    IFileWrap fileWrapRepository = MockRepository.GenerateMock<IFileWrap>();
    fileWrapRepository.expect(x => x.ReadAllLines("abc.txt").Return(new string[] {"Line 1", 
                                                                      "Line 2", "Line 3"});

    MethodThatReadsLines(fileWrapRepository.Object);
}
于 2016-05-22T10:43:47.630 に答える