BDD с SubSpec и XUnit NullReferenceException - PullRequest
       36

BDD с SubSpec и XUnit NullReferenceException

0 голосов
/ 13 декабря 2011

Довольно новый для TDD; хочу сначала попробовать BDD. Я использую MVP Presentation Pattern Framework и пытаюсь написать свой первый тест, используя SubSpec и XUnit, но я получаю исключение NullReferenceException от моего докладчика, когда я звоню в репозиторий.

Я уверен, что ответ очевиден, но он меня понял. Кроме того, похоже, что мой тест больше связан с деталями шаблона представления - я верю, что он работает и, вероятно, его не нужно тестировать, как показано ниже (то есть вызывать событие view.load), но я не мог думать другого пути. Любые предложения по улучшению теста приветствуются.

Мой юнит-тест:

[Specification]
    public void ViewLoad_WhenTheView.LoadEventIsRaised_ViewLoadShouldGetAll()
    {
        var view = MockRepository.GenerateMock<IOpenJobsView>();
        var repository = MockRepository.GenerateMock<IOpenJobsRepository>();
        var model = new OpenJobsModel().OpenJobs;
        var openJobs = new List<OpenJob>();
        var jobsFromModel = view.Stub(v => v.Model.OpenJobs).Return(model);
        var jobsFromRepo = repository.Stub(r => r.GetAll()).Return(openJobs);
        var presenter = default(OpenJobsPresenter); 

        "Given an openJobsPresenter"
            .Context(() => presenter = new OpenJobsPresenter(view, repository));

        "when the view loads"
            .Do(() => view.Raise(v => v.Load += presenter.ViewLoad, view, new EventArgs()));

        "the object subscribed to the event should result in a call to GetAll"
            .Assert(() => repository.AssertWasCalled(o => o.GetAll()));
        "the results from the call to GetAll should be equal to the model"
            .Assert(() => Assert.Equal(jobsFromModel, jobsFromRepo));

Мой ведущий:

public class OpenJobsPresenter : Presenter<IOpenJobsView>
{
    readonly IOpenJobsRepository openJobsRepository;

    public OpenJobsPresenter(IOpenJobsView view, IOpenJobsRepository openJobsRepository) : base(view)
    {
        this.openJobsRepository = openJobsRepository;
        View.Load += ViewLoad;
    }

    public void ViewLoad(object sender, System.EventArgs e)
    {
        View.Model.OpenJobs = openJobsRepository.GetAll(); //Getting NullReferenceException here
    }
}

1 Ответ

0 голосов
/ 13 декабря 2011

Хорошо. Я смог понять это. Нулевая ссылка была вызвана тем, что модель не была инициализирована представлением. Таким образом, я заглушил модель на представлении - это сделало это.

Я очистил свой тест и включил его вместе с тестируемой системой для полного решения.

Юнит-тест:

public class OpenJobsPresenterTests
{
    readonly OpenJobsModel _model;
    readonly IOpenJobsView _view;
    readonly IOpenJobsRepository _repo;

    public OpenJobsPresenterTests()
    {
        _model = MockRepository.GenerateMock<OpenJobsModel>();
        _view = MockRepository.GenerateMock<IOpenJobsView>();
        _repo = MockRepository.GenerateMock<IOpenJobsRepository>();
    }

    [Specification]
    public void OpenJobsPresenterShouldGetAllOpenJobsOnViewLoad()
    {
        var presenter = default(OpenJobsPresenter);
        var openJobs = new List<OpenJob>();
        _view.Stub(v => v.Model).Return(_model);
        _repo.Stub(d => d.GetAll()).Return(openJobs);

        "Given the OpenJobsPresenter"
            .Context(() =>  presenter = new OpenJobsPresenter(_view, _repo));

        "when the view's load event is raised"
            .Do(() => _view.Raise(d => d.Load += presenter.OnViewLoad, _view, new EventArgs()));

        "the event subscriber should get all open jobs"
            .Assert(() => _repo.AssertWasCalled(r => r.GetAll()));

        "the model should equal the results returned"
            .Assert(() => _view.Model.OpenJobs.ShouldBe(openJobs));
    }

}

SUT:

public class OpenJobsPresenter : Presenter<IOpenJobsView>
{
    readonly IOpenJobsRepository openJobsRepository;

    public OpenJobsPresenter(IOpenJobsView view, IOpenJobsRepository openJobsRepository) : base(view)
    {
        this.openJobsRepository = openJobsRepository;
        View.Load += OnViewLoad;
    }

    public void OnViewLoad(object sender, System.EventArgs e)
    {
        View.Model.OpenJobs = openJobsRepository.GetAll();
    }
}
...