0

私のコードは次のようになります。

public class FileFormatLookup : Dictionary<string,Func<string>>
{
    private Workbook workbook;
    private MemoryStream memoryStream;

    public  FileFormatLookup(Workbook workbook, MemoryStream memoryStream)
    {
        this.workbook = workbook;
        this.memoryStream = memoryStream;
        Add();
    }

    private void Add()
    {
        base.Add("xls", () =>
                            {
                                workbook.Save(memoryStream, SaveFormat.Excel97To2003);
                                return "ms-excel";
                            });
    }
}

そして、私は以下のようにテストを書こうとしています:

class FileFormatLookupTest
{
    FileFormatLookup fileFormatLookup;
    private Workbook workbook;
    private MemoryStream memoryStream;

    [SetUp]
    public void SetUp()
    {
        fileFormatLookup = new FileFormatLookup(workbook, memoryStream);
        workbook = MockRepository.GenerateMock<Workbook>();
        memoryStream = MockRepository.GenerateMock<MemoryStream>();
    }

    [TearDown]
    public void TearDown()
    {
      workbook.VerifyAllExpectations();
    }


    [Test]
    public void ShouldHaveXlsKey()
    {
        var xlsResult = fileFormatLookup["xls"].Invoke();
        workbook.AssertWasCalled(x=>x.Save(memoryStream,SaveFormat.Excel97To2003));
     }
}

これは辞書内のファンクターをテストする正しい方法ですか? このエラーがスローされます:

System.InvalidOperationException : No expectations were setup to be verified, ensure that the method call in the action is a virtual (C#) / overridable (VB.Net) method call

関数を返す辞書をテストするにはどうすればよいですか? 出来ますか?返される文字列値をアサートできますが、メソッド呼び出しはアサートできません。

4

1 に答える 1

3

テスト対象のクラスにモックを渡していない。

設定をに変更します

[SetUp]
public void SetUp()
{
    workbook = MockRepository.GenerateMock<Workbook>();
    memoryStream = MockRepository.GenerateMock<MemoryStream>();
    fileFormatLookup = new FileFormatLookup(workbook, memoryStream);
}

エラーメッセージから、期待値を設定する必要があるようです。つまり、期待しているモックオブジェクトを呼び出します。この場合workbook.Save(...)

これを行うには、workbook.Save(...)仮想またはインターフェイス上にある必要があります。


編集:コメントとして提供された詳細情報の後。

workbook.Save(...)が仮想でなく、コード内にない場合、オブジェクトをテストできるようにするには、少し長いルートを使用する必要があります。

メソッドを実装する独自のIWorkbookインターフェイスを作成してから、サードパーティクラスのインスタンスを含み、ラップされたクラスに呼び出しを転送することによって実装するクラスを作成します。Save()WorkbookWrapperWorkbookIWorkbook

public interface IWorkbook
{
    void Save(...);
}

class WorkbookWrapper : IWorkbook
{
    private _workbook;

    public WorkbookWrapper(...)
    {
        _workbook = new Workbook(...);
    }

    public void Save(...)
    {
        _workbook.Save(...);
    }
}

IWorkbook次に、代わりに次のようにコードを変更します。

private Workbook _workbook;

public FileFormatLookup(IWorkbook workbook, MemoryStream memoryStream)
{
    _workbook = workbook;
    _memoryStream = memoryStream;
    Add();
}

次に、他のクラスにも同じ手法を使用できますMemoryStream

于 2013-01-21T07:24:52.203 に答える