0

FakeItEasy を使用して、作成中の C# クラスのメンバーであるオブジェクトをモックしようとしています。

FakeItEasy のドキュメントには、次のような方法でオブジェクトを偽造することが示されています。

private static var m_physics = A.Fake<IPhysics>();

つまり、「var」キーワードを使用します。

ただし、この場合、C# コンパイラは、 varが非ローカル コンテキストで使用されていることを好みません。次のエラーが表示されます。

コンテキスト キーワード 'var' は、ローカル変数宣言内でのみ使用できます

ローカルでないオブジェクトをモックできませんか?

4

2 に答える 2

6

モック/スタブのポイントが欠けていると思います。モックとスタブは、依存する他のコンポーネントに応じて、テスト対象のサブジェクトが成功または失敗することを望まない場合にテストに使用されます。したがって、これらの明示的な実装を、テスト内で完全に制御できるこれらの依存関係のモック/スタブに交換します。

class Foo {
    public Foo(IBar bar) { }
    public object M() { // do something with IBar }
}

ここFooには依存関係がありIBarます。テストしたいFoo.MFooofに与える具体的な実装が機能しているかどうかに基づいて、テストが成功または失敗することは望ましくありませIBarん。

[Fact]
public void MDoesWhatItIsSupposeToDo() {
    var foo = new Foo(new Bar());
    object expected = // expected result
    Assert.Equal(expected, foo.M());
}

Barが壊れていると、完全に正しくコーディングされていても、このテストは失敗する可能Foo性があります。したがって、これを防ぐためにモック/スタブにサブスクライブします

[Fact]
public void MDoesWhatItIsSupposeToDo() {
    var bar = A.Fake<IBar>();
    // set up bar to do what is expected of IBars
    var foo = new Foo(bar);
    object expected = // expected result
    Assert.Equal(expected, foo.M());
}

Fooこのテストは、 の具体的な実装が正しいかどうかに関係なく、 が正しくコーディングされている場合にのみ合格または失敗しIBarます。

これがモックのポイントです。

つまり、モックを適切に使用していないということです。

ローカルでないオブジェクトをモックできませんか?

できますが、あなたがやっている方法ではできません。まず、フィールドを暗黙的に型指定することはできません。次に、行ったようにフィールドを明示的にモックしません。代わりに、次のようにします。

class Whatever {
    private IPhysics m_physics;

    public Whatever(IPhsyics physics) { this.m_physics = physics; }
}

それで:

var physics = A.Fake<IPhysics>();
var whatever = new Whatever(physics);
于 2011-05-11T17:24:46.840 に答える
0

'var' キーワードは、関数ブロックのようなローカル コンテキストでのみ使用できます。クラス メンバーを 'var' として宣言することはできません。

于 2011-05-11T17:17:29.200 に答える