Я думаю, вы упускаете из виду насмешки.Насмешки и заглушки используются для тестирования, когда вы не хотите, чтобы тестируемый объект проходил или не проходил в зависимости от других компонентов, от которых он зависит.Итак, что вы делаете, это обменивайтесь явными реализациями этих объектов для макетов / заглушек этих зависимостей, которые вы можете полностью контролировать в тесте.
class Foo {
public Foo(IBar bar) { }
public object M() { // do something with IBar }
}
Здесь Foo
зависит от IBar
.Мы хотим проверить Foo.M
.Мы не хотим, чтобы тест проходил или не проходил в зависимости от того, работает или нет конкретная реализация, которую мы передаем Foo
из 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);