Как издеваться над учениками в C #? - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь использовать FakeItEasy, чтобы смоделировать объект, который является членом класса C #, который я создаю.

Документация FakeItEasy указывает, что вы имитируете объект способом, подобным следующему:

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

То есть, используя ключевое слово "var".

Однако в этом случае компилятору C # не нравится тот факт, что var используется в нелокальном контексте. Я получаю эту ошибку:

Контекстное ключевое слово 'var' может появляться только в объявлении локальной переменной

Разве я не могу издеваться над объектом, который не является локальным?

Ответы [ 2 ]

6 голосов
/ 11 мая 2011

Я думаю, вы упускаете из виду насмешки.Насмешки и заглушки используются для тестирования, когда вы не хотите, чтобы тестируемый объект проходил или не проходил в зависимости от других компонентов, от которых он зависит.Итак, что вы делаете, это обменивайтесь явными реализациями этих объектов для макетов / заглушек этих зависимостей, которые вы можете полностью контролировать в тесте.

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);
0 голосов
/ 11 мая 2011

Вы можете использовать ключевое слово 'var' только в локальном контексте, например, в функциональном блоке.Вы не можете объявить члена класса как 'var'.

...