Angular Unit Testing - заглушка сложного объекта - PullRequest
0 голосов
/ 01 мая 2020

В моих модульных тестах я должен создать заглушки с большим количеством свойств.

Поэтому у меня будет такой интерфейс:

interface Person {
  id: string;
  name: string;
  age: number
  ...
}

Тогда мне придется создайте объект, который реализует этот интерфейс, и передайте некоторые значения каждому свойству. Разве у Jasmine нет функции, которая получает интерфейс и возвращает объект со значениями по умолчанию?

В приведенном выше примере я получу:

const stub: Person = createStubObj<Person>();
stub.id // ""
stub.name // ""
stub.getAge // 0

Я провел некоторые исследования, но не сделал ' Я не нашел ничего полезного.

createSpyObj , похоже, не помогает мне, потому что у меня нет функций, за которыми я хотел бы шпионить. Объект имеет только свойства.

Этот случай может произойти, когда HTTP-запрос возвращает сложный объект (множество свойств, вложенные свойства). Мне интересно, как я могу в этом случае высмеивать этот объект без необходимости указывать значение для каждого свойства.

Что-то похожее на то, что делает эта библиотека: https://www.npmjs.com/package/ts-auto-mock#usage

Мне интересно, может ли это быть достигнуто также в Жасмин или есть лучший подход

1 Ответ

1 голос
/ 01 мая 2020

Я склонен создавать определенные c фиктивные объекты, которые можно внедрить в тестируемый компонент с помощью регистрации поставщика TestBed:

    TestBed.configureTestingModule({
        providers: [
            TestComponent,
            { provide: RealInterfaceType, useValue: new MockObjectType() }
        ]
    });

Затем можно определить соответствующие значения свойств в фиктивном объекте. Точно так же вы можете использовать фиктивный объект в качестве ответа от зависимой службы, настроив шпиона:

    serviceSpy = jasmine.createSpyObj('SomeService', ['someFunction']);
    serviceSpy.someFunction.and.returnValue(new MockObjectType());

Для вызовов http я обычно проверяю их следующим образом ...

let injector: TestBed;
let service: TestService;
let httpMock: HttpTestingController;
const expectedResponse: TestObject = new TestObject();

beforeEach(() => {
    TestBed.configureTestingModule({
        imports: [HttpClientTestingModule],
        providers: [
            TestService
    });
    injector = getTestBed();
    service = injector.get(TestService);
    httpMock = injector.get(HttpTestingController);
});

afterEach(() => {
    httpMock.verify();
});

describe('someFunction', () => {
    it('should return an Observable<UserAuthResponse>', () => {
        service.someFunction().subscribe(response => {
            expect(response).toBe(expectedResponse);
        });
        const req = httpMock.expectOne('http://the-expected-url');
        expect(req.request.method).toBe('GET');

        // return the static expected value
        req.flush(expectedResponse);
    });
});

Это всего лишь проверка ожидаемого http-метода и URL-адреса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...