2016-10-17 2 views
1

В модульном тесте я звоню форсунку и шпионит на объекте HTTP, как это ...Угловой 2 инжектор каждый раз дает вам «новую» инстанцию?

beforeEach(async(inject([MyRepository, MockBackend, Http],(myRepository: MyRepository, backend: MockBackend, http : Http) => { 

    spyOn(http,'get').and.callThrough(); 

    backend.connections.subscribe((conn: MockConnection) => { 
     const options: ResponseOptions = new ResponseOptions({body: '[{"name":"chris"},{"name":"dave"}]'}); 
     conn.mockRespond(new Response(options)); 
    }); 
    TestBed.compileComponents(); 
    fixture = TestBed.createComponent(MyComponent); 
    fixture.detectChanges(); 

    }))); 

Но когда я реорганизовать spyOn несильно в вспомогательный метод, как это ...

class myTestHelper{ 
    public static spyOnHttp(): void{ 
    inject([Http],(http : Http) => { 
     spyOn(http, 'get').and.callThrough(); 
    }); 
    } 
} 

А затем вызвать мой новый код из моей тестовой установки (вместо spyOn непосредственно) я получаю следующее сообщение об ошибке ...

Error: <toHaveBeenCalledWith> : Expected a spy, but got Function.

Это похоже на использование новой функции ввода, возвращающей другой объект http. Но я думал, что они будут такими же? Если они не так, как угловые знают, какой из них использовать, если новый создается каждый раз, когда используется инжектор?

ответ

0

Angular2 DI поддерживает один экземпляр для провайдера.

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

Если вы предоставляете услугу в @NgModule(), то они поднимаются на область ввода DI, а отдельные экземпляры совместно используются всем приложением (опять же, если у компонента нет собственного провайдера для того же токена).

Когда несколько модулей предоставляют одну и ту же услугу, все еще поддерживается только один экземпляр DI, потому что с несколькими провайдерами для одного и того же токена для тех, которые добавлены позже, переопределяют ранее добавленные.

Lazy загруженные модули получают свою собственную область, где провайдеры в @NgModule() подняты.

DI начинает поиск по компоненту, запрашивает зависимость и смотрит в сторону корневой области для поставщика для этой зависимости и возвращает экземпляр serv ice первого поставщика, который он находит.

Токен может быть типом (классом) службы, строкой или OpaqueToken.

В короткой форме providers: [SomeService] такая же, как providers: [{provide: SomeService, useClass: SomeService}] и тип используется в качестве маркера (или ключ) (provide: SomeService), а также в качестве значения (useClass: SomeService)

+0

Таким образом, в этом случае, конечно, я бы иметь доступ к тем же аргумент «http», независимо от того, где я его называю, поскольку я только настраиваю один компонент в своем тесте? – Exitos

+0

Если вы повторно используете один и тот же экземпляр компонента и предоставляете только «Http» в этом компоненте, вы должны получить тот же экземпляр. Тем не менее, «Http» является апатридом, и я не знаю, что вы имеете в виду с «иметь доступ к тому же« http »аргументу.« TestBed.createComponent (MyComponent) »создает новый экземпляр компонента для каждого теста, поэтому каждый тест получает другой экземпляр Http. –

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