Модуль тестирования дает разные результаты в зависимости от среды тестирования - PullRequest
0 голосов
/ 03 июня 2018

Введение в тест

Мне дали модуль для работы, чтобы он прошел прилагаемый тест Jest.В настоящее время я застрял в следующем правиле теста:

describe(`TWO TIMES the SAME product ADDED`, () => {
  const _VATRate = 20;
  const _product = {
    name: 'product1',
    price: 1.50,
    quantity: 1
  };
  let _instance;
  let _cart;

  beforeEach(() => {
    _instance = window[NAMESPACE][MODULE_NAME]();
    _instance.init(_VATRate);

    _cart = _instance.addProducts([_product, _product]);
  });

  test(`cart's products`, () => {
    const result = Object.assign({}, _product, {'quantity': 2});
    expect(_cart.products).toEqual([result]);
  });
})

Ожидаемое значение будет: [{"name": "product1", "price": 1.5, "quantity": 2}]


Реализация модуля вбраузер (работает)

function CartModule() {
  var _Cart = {
    total: {
      beforeVAT: 0,
      afterVAT: 0,
      VAT: 0
    },
    products: [],
    VATRate: null
  };

  var _getCart = function() {
    return {
      total: _Cart.total,
      products: _Cart.products
    };
  };

  var _updateTotalPrice = function() {
    let invoice = _Cart.total;

    invoice.beforeVAT = 0;
    invoice.afterVAT = 0;
    invoice.VAT = 0;
    let roundDecimals = number => +number.toFixed(2);

    _Cart.products.forEach(product => {
      invoice.beforeVAT = roundDecimals(
        product.price * product.quantity + invoice.beforeVAT
      );
    });

    invoice.VAT = roundDecimals(_Cart.total.beforeVAT / 100 * _Cart.VATRate);
    invoice.afterVAT = invoice.VAT + invoice.beforeVAT;
  };

  return {
    init: function(VATRate) {
      return (_Cart.VATRate = VATRate || 0);
    },

    getCart: _getCart,

    addProducts: function(recievedProducts) {
      let products = Array.from(arguments),
        updatedProduct,
        cartProducts = _getCart().products,
        existingProduct;

      products.forEach(product => {
        existingProduct = cartProducts.findIndex(
          existing => existing.name === product.name
        );

        if (existingProduct >= 0) {
          updatedProduct = cartProducts[existingProduct];
          updatedProduct.quantity++;
          cartProducts[existingProduct] = updatedProduct;
        } else {
          updatedProduct = product;
          updatedProduct.quantity = 1;
          cartProducts.push(product);
        }
      });

      // Update Total Price
      _updateTotalPrice();
      return _getCart();
    },

    changeProductQuantity: function(product, newQuantity) {
      let products = _Cart.products,
        productIndex = products.findIndex(
          existing => existing.name === product.name
        );

      products[productIndex].quantity = +newQuantity;
      _updateTotalPrice();

      return _getCart();
    },

    removeProducts: function(product) {
      let products = _Cart.products,
        productIndex = products.findIndex(
          existing => existing.name === product.name
        );

      products.splice(productIndex, 1);
      _updateTotalPrice();

      return _getCart();
    },

    destroy: function() {
      /* Module = null */
    }
  };
}

var shoppingCart = CartModule(),
    _product = {
      name: 'product1',
      price: 1.50,
      quantity: 1
    };


shoppingCart.init(20);
shoppingCart.addProducts(_product, _product)

console.log(shoppingCart.getCart().products)

Jest-тестирование
Но в средах тестирования все по-другому.Кроме того, вывод ошибок версии sandbox и local различен:

Локальная версия

Expected value to equal:
      [{"name": "product1", "price": 1.5, "quantity": 2}]
    Received:
      [{"name": "product1", "price": 1.5, "quantity": 1}, {"0": {"name": "product1", "price": 1.5, "quantity": 1}, "1": {"name": "product1", "price": 1.5, "quantity": 1}, "quantity": 1}]

В то время как вывод версии песочницы:

Expected value to equal:
  [{"name": "product1", "price": 1.5, "quantity": 2}]
Received:
  [{"0": {"name": "product1", "price": 1.5, "quantity": 1}, "1": {"name": "product1", "price": 1.5, "quantity": 1}, "quantity": 1}]


Среды тестирования
Рабочая среда песочницы
enter image description here enter image description here

Edit zx9wy9l9qm

PS : Я буду очень признателен, если вы посмотрите и объясните, что я сделал не так в этом пункте, или что также может быть не так?

1 Ответ

0 голосов
/ 03 июня 2018

Я думаю, что это строка:

let products = Array.from(arguments),

Это приведет к созданию массива массивов продуктов, благодаря этой строке:

_cart = _instance.addProducts([_product, _product]);

Возможно, вы захотите использовать что-то вроде этого:

addProducts: function(recievedProducts) {
      let products = recievedProducts,

Если ваш addProducts может обрабатывать оба объекта как массив, вы можете сделать следующее:

addProducts: function(recievedProducts) {
      let products = Array.isArray(recievedProducts) ? receivedProducts : [receivedProducts],
...