Я использую фреймворк Jest и пытаюсь реализовать макет функции. У меня есть небольшое приложение для аэропорта, которое позволяет пользователю взлетать и приземляться, но оно должно быть ограничено из-за случайной погоды.
Погода в другом классе и рандомизирована, для моих тестов мне нужно смоделировать функцию погоды, чтобы всегда возвращать true в одном тесте и false в других.
Сложность у меня в том, как именно реализовать функцию макета? Документы говорят об использовании jest.fn
и установке его в постоянную переменную, но это смущает меня, так как я не понимаю, как jest.fn
может приравниваться к функции, когда она не указана в имени функции. Дальнейшие шутливые документы, хотя и всеобъемлющие, немного недоступны для кого-то, кто изучает, и большинство других ресурсов, которые у меня есть, приводят к той же путанице. В сущности, я надеюсь, что руководство по созданию условий для реализации этого? Такие как -
- как правильно объявить функцию как ложную?
- как явно объявить возвращаемое значение этой функции?
- как вызвать эту фиктивную функцию в моем наборе тестов?
ИСПЫТАНИЯ:
const Airport = require('./airport')
const Plane = require('./plane')
const Weather = require('./weather')
airport = new Airport('Bristol')
plane = new Plane('Boeing 747')
test('the airport lands a plane', () => {
expect(airport.land(plane)).toBe(1);
});
test('the airport allows a plane to take off', () =>{
expect(airport.takeOff()).toBe(0);
});
test('the airport has a default capacity of 1 when constructed', () => {
bath = new Airport('Bath')
expect(bath.capacity).toBe(1)
})
test('The airports default capacity can be defined at construction', () => {
bristol = new Airport('Bristol', 5)
expect(bristol.capacity).toBe(5)
});
test("The airport doesn't let you land when the hangar is full", () => {
wells = new Airport('Wells', 1)
plane2 = new Plane('Spitfire')
wells.land(plane)
expect(wells.land(plane2)).toBe('HANGAR FULL LANDING DENIED')
});
test("The airport doesn't let you land when weather is stormy", () =>{
york = new Airport('york', 1)
// york.weather = true
plane = new Plane('plane')
expect(york.land(plane)).toEqual('LANDING DENIED POOR WEATHER')
});
Файл аэропорта проверяется:
const Weather = require('./weather')
class Airport {
constructor(name, capacity = 1, weather = new Weather) {
this.name = name;
this.hangar = [];
this.capacity = capacity;
this.weather = weather.getWeather();
}
land (plane) {
if (this.weather === true) {
return 'LANDING DENIED POOR WEATHER'
} else if (this._isFull() === false) {
this.hangar.push(plane)
return this.hangar.length
} else {
return 'HANGAR FULL LANDING DENIED'
}
};
takeOff () {
this.hangar.pop()
return this.hangar.length;
};
_isFull () {
if (this.hangar.length < this.capacity) {
return false
} else {
return true
}
};
};
module.exports = Airport;
Класс погоды со случайной функцией погоды:
class Weather {
getWeather() {
var chance = Math.floor(Math.random() * 10)
if (chance <= 3) { return true } else { return false }
}
}
module.exports = Weather;
Вы можете увидеть в файле, что я нашел плохой способ переопределить погоду, вручную установив для свойства в аэропорту значение true. Мне сообщили, что это запах кода, хотя и я хочу изменить рефакторинг на правильную функцию макета /module/class.