Я написал тест для своего API с шуткой. Я добавил функцию, которая вызывает мой API в тестовом файле, как показано ниже:
import AuthManager from "../Client/Modules/Auth/AuthManager";
и используйте его, как показано ниже:
test("login api resolves true", () => {
return expect(AuthManager.login("test", "test")).resolves.toMatchObject(
expect.objectContaining({
accessToken: expect.any(String),
email: expect.any(String),
expiresIn: expect.any(Number),
refreshToken: expect.any(String),
userFullName: expect.any(String),
userId: expect.any(Number)
})
);
});
Мой тест проходит, но у меня есть ошибка, как показано ниже:
Error: Not implemented: window.alert
Как решить эту проблему?





тестовая среда по умолчанию для Jest – это браузероподобная среда, предоставляемая jsdom.
jsdom реализует большую часть того, что может предоставить реальный браузер (включая глобальный объект window), но не все.
Специально для этого случая jsdom не реализует window.alert, а вместо этого выдает Error при вызове, как видно из исходного кода здесь.
Пока вы знаете, почему ваш код запускает alert, и знаете, что ваш тест работает правильно, кроме Error, вы можете подавить Error, предоставив пустую реализацию для window.alert:
test("login api resolves true", () => {
const jsdomAlert = window.alert; // remember the jsdom alert
window.alert = () => {}; // provide an empty implementation for window.alert
return expect(AuthManager.login("test", "test")).resolves.toMatchObject(
expect.objectContaining({
accessToken: expect.any(String),
email: expect.any(String),
expiresIn: expect.any(Number),
refreshToken: expect.any(String),
userFullName: expect.any(String),
userId: expect.any(Number)
})
); // SUCCESS
window.alert = jsdomAlert; // restore the jsdom alert
});
@dcp Вы должны правильно издеваться над этим, используя jest.fn, например. window.alert = jest.fn(() => ({})); ;)
@GlennMohammad window.alertничего не возвращает, поэтому, если вы хотите использовать фиктивную функцию Jest, это будет просто window.alert = jest.fn();
@brian-lives-outdoors Хорошо, спасибо за исправление. Я, наверное, замечтался ?
Как я решил эту проблему, на самом деле определил метод window.alert в верхней части тестового файла как шпионскую шутку. Это должно работать для любого метода окна (в моем случае я действительно тестировал window.open).
Обязательно вызовите mockClear() в своем тесте, так как это глобальный объект, и его вызовы будут сохраняться в тестах.
window.alert = jest.fn();
test("login api resolves true", () => {
window.alert.mockClear();
/* ... */
})
Я столкнулся с window.confirm
Это мое решение для angular fw.
let spyOnWindow: jasmine.Spy;
beforeEach((() => {
TestBed.configureTestingModule({
declarations: [...],
imports: [...],
providers: [...]
}).compileComponents().then(() => {
...
spyOnWindow = spyOn(window,'confirm');
...
});
Какой-то тестовый случай
it('showModal testing function with delete an event', () => {
spyOnWindow.and.returnValue(true);
...
}
it('showModal testing function with delete an event', () => {
spyOnWindow.and.returnValue(false);
...
}
Хорошее предложение, но оно не сработало для меня, так как я все еще получаю нереализованную ошибку