2016-05-09 4 views
0

Получил пару проблем с моим тестированием устройства с помощью жасмина. Первый из них:Угловой 2 модульный тест

Мне нужно, чтобы проверить это в компонент под названием CaseList:

gotoDetail(case: Case){ 
    this._router.navigate(['CaseDetail', {"id": case.id}]); 
} 

Все мои попытки испытаний дают погрешность this._router неопределен, так это потому, что я не определил его в моем тесте, поскольку я не могу понять, как! Я даже не придумал никаких хороших попыток на тестах, поскольку я понятия не имею, как действовать дальше. Вот почему я не добавил ни одной попытки ...

Редактировать: часть в тесте маршрутизатора, которая связана с проблемой выше, но я проверяю всю маршрутизацию в отдельном файле! Этот тест работает!

it('Should navigate to Case Detail List', (done) => { 
router.navigate(['CaseDetail', {id: 'test'}]).then(() => { 
     expect(location.path()).toEqual('/casedetail/test'); 
     done(); 
    }).catch(e => done.fail(e)); 
}); 

Вторые тесты из Деталь компонентов (где пользователь управление судном после выбора случая):

addStep(){ 
    this.case.getSteps().push(new Step()); 
} 

У меня также есть метод удалить мне нужно тест:

removeStep(step: Step){ 
    this.case.removeStep(step); 
} 

Конструктор этот компонент:

constructor(public _routeParams: RouteParams, public _service: Service) { 
    this.case = _service.getById(_routeParams.get('id')); 
} 

Так что тест, который я попытался сделать для надстройки методы:

it('passes new step to case-class',() => { 
    spyOn(case, 'addStep') 
    .and.returnValue(Observable.of({complete: true})) 
    caseDetail.addStep(); 
    expect(case.addStep).toHaveBeenCalledWith(step); 
}); 

Таким образом, эти методы вызывают методы, которые находятся в отдельном классе под названием «Дело».

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

метод в одном компоненте, обращаясь к «Шаг» -класса:

addFeedback(step: Step){ 
    step.addFeedback(new Feedback()); 
} 

Тестирование работает отлично:

it('passes feedback value to Step class',() => { 
    spyOn(step, 'addFeedback') 
    .and.returnValue(Observable.of({complete: true})) 
    caseDetail.addFeedback(step); 
    expect(step.addFeedback).toHaveBeenCalledWith(feedback); 
}) 

Так, очевидно, в тестировании компонент я должен иметь все, что определено необходимо, так как работает тестирование метода обратной связи. Мне просто нужно как-то определить объект «case», чтобы он не жаловался на то, что он является нулевым.

Ну, надеюсь, вы получите мою проблему под рукой и, надеюсь, вы сможете помочь! :)

ответ

1

Чтобы ваши тестовые примеры работали, вам необходимо будет добавить маршрутизатор и корпус в качестве поставщика перед тестом.

Пример маршрутизации:

import {RootRouter} from 'angular2/src/router/router'; 
import {Location, RouteParams, Router, RouteRegistry, ROUTER_PRIMARY_COMPONENT} from 'angular2/router'; 
import {SpyLocation} from 'angular2/src/mock/location_mock'; 
import {provide} from 'angular2/core'; 

describe('Router',() => { 
    let location, router; 

    beforeEachProviders(() => [ 
    RouteRegistry, 
    provide(Location, {useClass: SpyLocation}), 
    provide(Router, {useClass: RootRouter}), 
    provide(ROUTER_PRIMARY_COMPONENT, {useValue: App}), 
    ]); 

    beforeEach(inject([Router, Location], (_router, _location) => { 
    router = _router; 
    location = _location; 
    })); 

    it('Should be able to navigate to Home', done => { 
    router.navigate(['Index']).then(() => { 
     expect(location.path()).toBe(''); 
     done(); 
    }).catch(e => done.fail(e)); 
    }); 
}); 

Case Поставщик:

import {Case} from '../case'; 

    beforeEachProviders(() => [ 
    provide(case, Case) 
    ]); 
+0

У меня есть отдельный тест для маршрутизатора, практически идентичную вашему примеру. Это прекрасно работает. Я не уверен, что вы имеете в виду «добавить маршрутизатор и корпус в качестве поставщика перед тестированием».Я действительно новичок в кодировании, и это моя первая попытка модульного тестирования;) Добавлен тест маршрута, связанный с моей первой «проблемой» - «gotodetail» в моем исходном вопросе. Как сказал маршрут тест работает отлично! Но мне нужно проверить «gotodetail» в компоненте, и я не уверен, как определить там маршрутизатор? Нужно ли мне добавлять весь этот код там, чтобы проверить «gotodetail»? – Alex

+0

Или мне нужно проверить «goToDetail» вообще, так как маршрут протестирован? Думаю, я немного смущен. И вторая проблема также остается, если она равна нулю, поэтому, если у кого-то есть какие-то идеи, это было бы очень полезно :) – Alex

+0

Если вы просматриваете маршруты внутри вашего модульного теста, тогда да, вам понадобится весь код. Для случая, когда null, я не слишком уверен, в каком случае, но вы можете попробовать добавить случай в качестве провайдера перед модульным тестом. – xphong

Смежные вопросы