モック/スタブのポイントが欠けていると思います。モックとスタブは、依存する他のコンポーネントに応じて、テスト対象のサブジェクトが成功または失敗することを望まない場合にテストに使用されます。したがって、これらの明示的な実装を、テスト内で完全に制御できるこれらの依存関係のモック/スタブに交換します。
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
ここFoo
には依存関係がありIBar
ます。テストしたいFoo.M
。Foo
ofに与える具体的な実装が機能しているかどうかに基づいて、テストが成功または失敗することは望ましくありませ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);