Испытание KnockoutJS вызывая ko.вычисляется в jasmine

В настоящее время у меня ko.вычисляется в моей модели представления с немногими зависимостями. Написание тестового набора Jasmine для сравнения предыдущего значения с текущим я не могу понять, как вызвать ko.вычисляемая функция.

Ниже мой ko.вычисленный.

ko.computed(function () {
            if (offers.hasError()) {
                model.offers.resetCards(self.offersCards);
            }
        });

Есть ли способ вызвать это?

1 ответ

  1. Ваш computedНа самом деле ничего не возвращает, что заставляет меня думать, что вы хотели использовать subscribe:

    offers.hasError.subscribe(function(newValue) {
      if (newValue) {
        model.offers.resetCards(self.offersCards);
      }
    });
    

    Это может быть вызвано изменением значения hasErrorна что-то новое:

    offers.hasError(!offers.hasError());
    

    Чтобы получить текущее значение вычисляемого, вызовите его с помощью ():

    var comp = ko.computed(function() { return "A" });
    console.log(comp()); // Prints "A"
    

    Чтобы отслеживать предыдущее и текущее значение, можно создать "beforeChange"подписку. Вот как это работает:

    var obs = ko.observable("Observable");
    
    
    var computed = ko.computed(function() {
      return "Computed " + obs();
    });
    
    computed.subscribe(function(oldValue) {
      console.log("Value before: " + oldValue);
    }, null, "beforeChange");
    
    computed.subscribe(function(newValue) {
      console.log("Value after: " + newValue);
      console.log("---------------------");
    });
    
    
    obs("Observable 1");
    obs("Observable 2");
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

    Поэтому, если вы хотите написать тест, который сравнивает новое значение со старым, вы можете написать это:

    var obs = ko.observable("Observable");
    var computed = ko.computed(function() {
      return "Computed " + obs();
    });
    
    
    var computedOldValue = computed();
    
    // Whenever the computed changes, store its old value
    computed.subscribe(function(oldValue) {
      computedOldValue = oldValue;
    }, null, "beforeChange");
    
    // To compare the current to the new value:
    console.log("Computed has changed: ", computedOldValue !== computed());
    
    obs("TEST");
    
    console.log("Computed has changed: ", computedOldValue !== computed());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>