LoginSignup
3
1

More than 5 years have passed since last update.

SeleniumでSinon.jsを使う

Last updated at Posted at 2015-01-27

例えばこういう感じの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テストはがんばりすぎると死ぬのでやりすぎには注意しよう。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1