簡體   English   中英

Ruby中的異步單元測試

[英]Asynchronous Unit Tests in Ruby

我正在測試一些使用ruby's 和諧建立的javascript庫。 除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調用有效地同步,從而解決了該問題。 如何執行此操作取決於您的框架,並且我對Harmony和RightJS不熟悉。 但是,邏輯看起來像這樣:

  1. 覆蓋您的XHR方法,使其保持鎖定/互斥。 鎖可以是一個簡單的布爾值。 當有任何XHR進行中時,鎖定將為true ;當沒有XHR進行中時,鎖定將為false
  2. 在測試中,在運行斷言之前,添加一個執行XHR的循環,然后等待直到鎖被清除。
  3. 循環結束后,您將確保XHR已完成,並且可以運行斷言。

這種方法的目的是避免修改您的代碼,這會使您的測試無效。 不幸的是,這也意味着您無法測試返回值本身,但是我認為這將是任何不修改代碼的策略的警告。

另一種方法是實際異步運行測試,即 使用AOP將您的斷言附加到onSuccess回調。 但是,許多測試套件不能很好地與異步測試配合使用,因為一個測試的設置可能在上一個測試的拆除之前開始(即,因為前一個測試仍在等待異步調用返回)。

最后一種方法是模擬所有異步調用。 就是 只需覆蓋XHR並讓您的測試斷言已使用正確的參數調用了它。 如果我的集成測試確實通過了整個異步堆棧,那么我可能會喜歡這種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM