Как реализовать Jest Mocks? - PullRequest
0 голосов
/ 21 января 2019

Я использую фреймворк 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.

1 Ответ

0 голосов
/ 22 января 2019

Ваш класс Airport настроен на получение погоды с помощью инъекции зависимостей .

Он вызовет getWeather для третьего параметра, переданного конструктору (или нового экземпляра Weather, если ничего не указано), чтобы установить погоду для Airport.

Вы можете использовать эту инъекцию зависимости, чтобы обеспечить фиктивную реализацию зависимости Weather, чтобы установить желаемую погоду для теста:

test("The airport doesn't let you land when weather is stormy", () =>{
  const york = new Airport('york', 1, { getWeather: () => true })  // always bad weather
  const plane = new Plane('plane')
  expect(york.land(plane)).toEqual('LANDING DENIED POOR WEATHER')  // SUCCESS
});
...