Edited at

SeleniumでSinon.jsを使う

More than 3 years have passed since last update.

例えばこういう感じのJSがあったとして

$('button').click(function() {

navigator.geolocation.getCurrentPosition(
function(res) {
var lat = res.coords.latitude;
var lon = res.coords.longitude;
$('#pos').text(lat + ':' + lon);
});
});

これをE2Eテストで検証するのはなんかもう色々めんどうなので、sinon.jsでstub化したい。

こういうJSファイルを用意しておいて、

// stub.js

sinon.stub(navigator.geolocation, 'getCurrentPosition')
.callsArgWith(0, { coords: { latitude: 10, longitude: 20 } });

テストスクリプトからsinon.js本体とこいつを実行する。

var webdriver = require('selenium-webdriver');

var firefox = require('selenium-webdriver/firefox');
var fs = require('fs');
var assert = require('assert');
var By = webdriver.By;
var promise = webdriver.promise;
var flow = promise.controlFlow();
var driver = new firefox.Driver();

flow.execute(function() {
driver.get('http://localhost:8888/');
driver.executeScript(fs.readFileSync('./sinon.js').toString());
driver.executeScript(fs.readFileSync('./stub.js').toString());
driver.findElement(By.css('button')).click();
driver.findElement(By.css('#pos')).getText().then(function(text) {
assert(text === '10:20');
});
driver.quit();
}).then(function() {
console.log('ok');
}, function(e) {
console.log(e.message);
});

(restoreとかははしょってる)

こういうケースの他にも、手で再現しづらい異常系を再現する場合とか、APIのレスポンスをmock化したい場合とかにも使えると思う。

ただしE2Eテストはがんばりすぎると死ぬのでやりすぎには注意しよう。