2017-01-06 7 views
0

Мне нужно проверить, действительно ли происходит window.location.href = data.redirect_path. Как бы я высмеивал это в Синоне, не отталкивая меня от моего тест-бегуна? Я использую chai/mocha.js с чайной ложкой в ​​качестве моего тест-бегуна.Единичный тест для window.location.href в запросе AJAX с использованием mocha/chai

$.ajax({ 
    type: 'PUT', 
    url: $url, 
    dataType: 'json', 
    data: { user: $userData }, 
    success: function(data) { 
     if (data.success == true) { 
     window.location.href = data.redirect_path 
     } else { 
     $errorsContainer.html(data.html); 
     $codeInput.select(); 
     if (typeof data.redirect_path !== 'undefined') { 
      window.location.href = data.redirect_path 
     }    
     } 
    } 
    }); 

ответ

0

Вы можете stub на $ для ajax, как показано ниже. Это требует некоторого рефакторинга на вашем коде, чтобы он легко проверялся.

Ваш успех обратного вызова должна быть такой,

success: function(data) { 
     if (data.success == true) { 
     window.location.assign(data.redirect_path) 
     } else { 
     $errorsContainer.html(data.html); 
     $codeInput.select(); 
     if (typeof data.redirect_path !== 'undefined') { 
      window.location.assign(data.redirect_path); 
     }    
     } 
    } 

Направить doc как location.assign работает.

it("should fake successful ajax request", function() { 
    sinon.stub($, "ajax").yieldsTo("success", {redirect_path: '/home', success: true}); 
    sinon.stub(window.location, 'assign'); // stubbing the assign. so that it wont redirect to the given url. 

    //here you call the function which invokes $.ajax(); 
    someFunction(); 

    // assert here 

    // manually restoring the stubs. 
    $.ajax.restore(); 
    window.location.assign.restore(); 
}) 
1

Я потянул свои волосы за последние 2-3 часа по аналогичной проблеме. К сожалению, переход с помощью window.location = href был очень важным поведением в моем плагине, поэтому я не мог просто взять его на веру. Выше с использованием window.location.assign(href) не сработало для меня - возможно, из-за jsdom, не уверен.

Наконец-то я придумал (довольно) простое решение, которое работает в моем случае.

it('reloads the page when using the browsers back button', (done) => { 
    let stub = sinon.stub(window, 'location').set(() => { done() }); 

    // do whatever you need to here to trigger 
    // window.location = href in your application 
}); 

Я знаю, что он работает на долгое время ожидания, поэтому, когда он терпит неудачу, вы должны ждать его, но это намного лучше компромисс для меня, чем не имеющие тестов, доказывающие мой плагин ведет себя, как ожидалось.

Примечание jsdom делает не имеют сеттера для window.location первоначально но sinon позволяет создать.