Machine.Fakes, как проверить реализацию виртуального метода? - PullRequest
0 голосов
/ 23 марта 2012

Учитывая, что у меня есть класс контроллера как таковой:

public class ResourceController : AuthorizedController
{      
    public virtual string Resource()
    {
         //do magic
    }

    public virtual string ResourceParent()
    {
        var url = Resource();
        return url;
    }
}

}

С помощью жгута проводов:

[Subject(typeof (ResourceController))]
public class When_I_want_the_parent_resource : WithSubject<ResourceController>
{
    private static readonly string ParentUrl = "/organizations/1";
    private static readonly string ResourceUrl = "/organizations/1/contacts/1";
    private static string _result;

    private Establish context = () =>
                                    {
                                        The<ResourceController>()
                                            .WhenToldTo(x => x.Resource())
                                            .Return(ResourceUrl);
                                    };

    private Because of = () => _result = Subject.ResourceParent();

    private It should_match_the_expected_parent_url = () =>
                             _result.ShouldEqual(ParentUrl);
}

Этот модульный тест не пройден, поскольку субъект.ResourceParent () возвратит нуль, потому что Machine.Fakes автоматически заблокировал этот метод.В качестве временного решения я просто удалил виртуальное ключевое слово из ResourceParent, чтобы иметь возможность протестировать мой код.Я предполагаю, что должно быть реальное решение для меня, чтобы сказать Machine.Fakes не переопределять ResourceParent()

Ответы [ 3 ]

3 голосов
/ 25 марта 2012

на самом деле в "Машине" нет "настоящего" решения. Подделки для этого.Я бы сказал, что вам нужно пересмотреть свой дизайн светильников.

Прежде всего, как уже заметил Тим, вы не должны подделывать какие-либо методы на сам предмет.Вместо этого вы должны подделать зависимости вашего контроллера и использовать ваш контроллер как есть в спецификациях.Предполагаемое использование метода «The» - это доступ к зависимостям субъекта по спецификации, но в вашей спецификации вы пытаетесь получить доступ к самому субъекту.Я думаю, что здесь все идет не так. и субъект на самом деле являются отдельными экземплярами.Вот почему вы настроили взаимодействие не происходит.

В вашем коде есть только несколько вариантов, чтобы исправить это:

  • Введите новую зависимость в вашем коде, которую вы можете заглушить через "The"
  • Если первое кажетсяв тяжелом весе вы также можете заменить виртуальный метод на зависимость Func для вашего контроллера и использовать метод "Configure", чтобы добавить спецификацию, специфичную для вашей спецификации.

HTH,

Бьорн

2 голосов
/ 24 марта 2012

Если вы тестируете контроллер, то, возможно, вам не следует создавать макеты или подделки этого контроллера . В противном случае вы просто тестируете макет, а тест на самом деле не имеет никакой силы.

Ложить или подделывать зависимости контроллера. Проверьте настоящий контроллер.

0 голосов
/ 29 марта 2012

В конце концов я вытащил этот тест из Machine.Fakes и поместил его в обычный модульный тест.Затем я просто использовал Moq для настройки HttpRequestBase для заполнения необходимых мне данных, а затем просто вручную создал класс контроллера и вызвал для него методы.

...