2015-06-09 24 views
13

Projemi test etmek için Protractor, CucumberJS ve Jasmine kullanmayı düşünüyorum. Hem Jasmine hem de CucumberJS'yi İletki ile birlikte nasıl kullanırım?Yasemin ve SalatalıkJS İletki ile birlikte nasıl kullanılır

// yol/myproj/protractor.conf.js

exports.config = { 
    seleniumServerJar: 'node_modules/protractor/selenium/selenium-server-standalone-2.45.0.jar', 

    specs: [ 
    'features/*.feature' 
    ], 

    baseUrl: 'http://localhost:8080', 

    multiCapabilities: [ 
    { 
     'browserName': 'chrome' 
    } 
    ], 

    allScriptsTimeout: 380000, 
    getPageTimeout: 20000, 

    framework: 'cucumber', 

    cucumberOpts: { 
    require: 'features/stepDefinitions.js', 
    format: 'summary' 
    } 
}; 

Gördüğünüz gibi bu proje çerçeve olarak "salatalık" kullanır: İşte oluşturduk proje tuzak. CucumberJS ile birlikte Jasmine çerçevesine nasıl eklerim? Bu, İletici yapılandırma dosyasında mı yoksa kodda başka bir yerde mi olacak?

/yol// myproj/özellikler/demo.feature

Feature: Some terse yet descriptive text of what is desired 

    Scenario: Some determinable business situation 
    Given some precondition 

// yol/myproj/özellikler/stepDefinitions.js

module.exports = function() { 
    this.Given(/^some precondition$/, function (callback) { 
    expect(true).toEqual(true); 
    callback(); 
    }); 
}; 

bu yürütüldüğü zaman

"Beklenti" tanımlanmamıştır, muhtemelen Jasmine entegre edilmemiştir ve bununla birlikte küresel olmasını beklemektedir. İşte tam hata mesajı yok:

$ $(npm bin)/protractor protractor.conf.js 
Starting selenium standalone server... 
[launcher] Running 1 instances of WebDriver 
Selenium standalone server started at http://192.168.1.115:59957/wd/hub 
(::) failed steps (::) 

ReferenceError: expect is not defined 
    at World.<anonymous> (/path/to/myproj/features/stepDefinitions.js:3:5) 
    at process._tickCallback (node.js:355:11) 


Failing scenarios: 
/path/to/myproj/features/demo.feature:3 # Scenario: Some determinable business situation 

1 scenario (1 failed) 
1 step (1 failed) 
Shutting down selenium standalone server. 
[launcher] 0 instance(s) of WebDriver still running 
[launcher] chrome #1 failed 1 test(s) 
[launcher] overall: 1 failed spec(s) 
[launcher] Process exited with error code 1 

// yol/myproj/package.json

{ 
    "name": "myproj", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
    "cucumber": "0.4.9", 
    "protractor": "git+https://github.com/angular/protractor.git#0262268fa43b9eefac815d986740efa07bb15818" 
    } 
} 

Not: Belirli bir zaman pakete Açıölçer Git depo taahhüt kullanıyorum. json, çünkü en son sürüm (2.1.0), CucumberJS ile entegrasyonu engelleyen a bug'a sahiptir.

cevap

23

SalatalıkJS ve Yasemin karşılıklı olarak münhasırdır; Jasmine'in Salatalık basamaklarındaki beklentilerini kullanamayacaksınız. Bunun yerine yapmanız gereken ayrı bir beklenti modülü yüklemektir. chai-as-promised eklentisiyle Chai'u öneririm. (vaat edilen vaatler, vaatler etrafında beklentiler yazma sürecini basitleştirir. İtirazcı, perde arkasında sizin için bunu yapmak üzere Jasmine'de expect() işlevini geçersiz kılar). Bunu yapmanın en kolay yolu, bunu muhtemelen sizin Dünya'nızda yapmak isteyeceksiniz. Adım Tanımlarınızda ona erişim. Dünyanız şöyle görünecektir:

sizin Adım Tanımlar Sonra
var World, chai, chaiAsPromised; 
chai = require('chai'); 
chaiAsPromised = require('chai-as-promised'); 

World = function World(callback) { 
    chai.use(chaiAsPromised); 
    this.expect = chai.expect; 
    callback(); 
} 

module.exports.World = World; 

sadece CucumberJS documentation başına Dünyada yük dosya ve Basamak Tanımlar Dünya tüm özelliklerine erişim sağlamak alanına dahil edilecektir konum:

Şimdi
module.exports = function() { 

    this.World = require("path/to/world.js").World; 

    this.Given(/^some precondition$/, function (callback) { 
    this.expect(true).to.equal(true); 
    callback(); 
    }); 
}; 

, bazı utanmaz bir kendini teşvik: Eğer CucumberJS ile Protractor kullanıyorsanız, ben CukeFarm denilen build yardımcı bir modül bakarak öneriyoruz. Kullanışlı bulduğunuz birkaç modülle önceden yapılandırılmış ve çoğu projede kullanılabilecek bir dizi Genel Adım Tanımlaması sağlar.

+0

github bu projede göz at. Mocha'nın bir ünite test çerçevesi olarak popüler olmasının nedenlerinden biri de budur, bu nedenle, Hucrar testleri yazmak için kullanılan aynı beklenti modülü, test koduna dayanan daha tutarlı bir kod oluşturmak için birim testleri yazmak için de kullanılabilir mi?Cevabınız ve CukeFarm tavsiyesi için teşekkür ederiz! –

+0

@AristarkhArtemiy yep, bu Mocha için gitmek için sebep çok iyi. Ünite testlerinizdeki aynı kalıpları/sözdizimini (örneğin chai ile) ve Salatalık adım tanımlarını kullanmak, özellikle de diğer insanlar kod tabanına atlamak zorundaysa iyi bir şeydir. – jbpros

+0

CucumberJS ve Jasmine'in neden ayrıcalıklı olduğuna dair nedenleri açıklayabilir misiniz? E2E testlerini yürütmek için CucumberJs iletki içine entegre etmeye çalışıyorum. Eğer bu işi yapabilirsem, bu çok hoş olurdu. Yığını kullanıyorum: Angular2, webpack, .. –