Вопрос

Я проверяю некоторые библиотеки JavaScript, которые я построил с помощью Ruby's гармония. Отказ Все работает отлично, кроме звонков Ajax - у кого-нибудь есть какие-либо идеи, как это достичь?

Мой код выглядит что-то вроде этого (я использую Rightjs.):

my.js.

function makerequest(argument) {
    new Xhr('http://mysite.com/some/jsonp'),{
        jsonp: true,
        params: {something: argument},
        onSuccess: function() {
            // Calls a function defined outside my library
            parse_response(this.json)
        }
    }).send()
}

test_makerequest.rb.

require 'rubygems'
require 'harmony'
require 'test/unit'
require 'shoulda'

class RequestTest < Test::Unit::TestCase
    context "The requesty thing" do
        setup do
            @page = Harmony::Page.new
            @page.load(File.expand_path('js/my.js'))
        end

        should "get stuff from mysite.com" do
            # Here I need to define a 'parse_response' which this
            # should section will wait for and then do an 'assert'
            # on the results.
            results = callback_to_get_results_from__make_request
            @page.execute('make_request("an argument")')
            assert results == {'foo' => 'bar'}
        end
    end
end

Так что да, мой вопрос, как я должен назначить results Выше так, чтобы я мог получить результаты асинкового обратного вызова?

Это было полезно?

Решение

Асинхронистые вызовы, как правило, проблематичны с тестированием блока JS. Я решил его в прошлом, сделав XHR вызовы эффективно синхронно, блокируя основной нить, пока XHR вызов не будет успешным. Как это сделать варьируется в зависимости от вашей структуры, а я незнакома с гармонией и правой. Тем не менее, логика будет выглядеть что-то подобное:

  1. Переопределите свой метод XHR так, чтобы он поддерживал блокировку / мьютекс. Замок может быть простой логией. Когда любой XHR находится в процессе, замок будет true, когда нет XHR в процессе, замок будет false.
  2. В вашем тесте, прежде чем запустить свое утверждение, добавьте цикл, которая выполняет ваш XHR, а затем ждет, пока блокировка не очистится.
  3. После того, как петли заканчивается, вы будете уверены, что XHR завершен, и вы можете запустить свое утверждение.

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

Другим подходом было бы на самом деле проводить свои испытания асинхронно - то есть. Прикрепите ваше утверждение к обратным вызовам ONSUCCESS с использованием AOP. Тем не менее, многие тестирующие люксы не играют красиво с асинхронными тестами, поскольку настройка одного теста может начинаться до разрыва предыдущего теста (т. Е. Поскольку предыдущий тест все еще ждет async Call для возврата).

Одним из последних подходов будет молодеть все асинхронные звонки. Т.е. Просто переопределите XHR и вытесните свой тест, что его называли с правильными аргументами. Я мог бы поддержать этот подход, если у меня есть тесты интеграции, которые проходят через весь стек Async.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top