Приложения Kanso являются приложениями CouchDB. Однако лучше всего проигнорировать CouchDB на данный момент. Важно следующее: приложения Kanso - это приложения Node.js . Протестируйте их так же, как и приложение Node.js. Проверьте, что они придерживаются документированного CouchDB API, и все будет в порядке.
В идеале, мы можем захотеть запустить тесты на самом деле в CouchDB . Механизмы JavaScript отличаются (V8 против SpiderMonkey); среды разные. Однако на практике гораздо проще протестировать код Node.js. (Кроме того, на обеих платформах отсутствует целый класс ошибок JavaScript: сторонний код, устанавливающий глобальные переменные, изменяющий встроенные типы, меняющий прототипы - все это проблемы браузера. Node.js и CouchDB являются нетронутыми и предсказуемыми.)
Пример
Давайте создадим простое приложение Couch, которое выводит «Hello world» в функции _show .
Файл kanso.json
:
{ "name" : "hello_world"
, "version": "0.1.0"
, "description": "A simple hello-world Couch app"
, "dependencies": { "node-couchapp": "~0.8.3" }
, "app": "app"
}
Следующий запуск kanso install
, который включит зависимость "node-couchapp". (Обратите внимание, что использование команды kanso
похоже на использование команды npm
.)
Давайте сделаем очень простое приложение Couch, в ./app.js
:
// A Couch app that just says hello in a _show function.
module.exports = {
'shows': {
'hello': function(doc, req) {
var who = req.query.who || "world"
return "Hello, " + who
}
}
}
Я запустил kanso push http://example.iriscouch.com/so_hello
, и я вижу мое приложение здесь:
Добавление тестов
Мне нравится node-tap , так что давайте использовать это. Но главное, это всего лишь некоторый код Node.js. Протестируйте его любым удобным для вас способом.
Сначала быстрый package.json
файл:
{ "name" : "hello_world"
, "description": "A simple hello-world Couch app"
, "version": "0.1.0"
, "private": true
, "devDependencies": { "tap": "~0.2.3" }
}
Запустите npm install
, чтобы получить пакет node-tap. (И у меня всегда есть ./node_modules/.bin
в моем $PATH
, когда я работаю на Node.js. Вместо глобальной установки, мне нравится иметь все, что мне нужно, прямо в проекте.
Далее, возможно, файл test/show_function.js
:
var tap = require('tap')
tap.test('The Couch app loads', function(t) {
t.doesNotThrow(load_app, 'No problem loading the app.js file')
t.end()
function load_app() {
var app = require('../app')
}
})
tap.test('The show function', function(t) {
var app = require('../app')
, hello = app.shows.hello
t.type(hello, 'function', 'Show function "hello" in the couch app')
var doc = {}
, null_req = {'query':{}}
, john_req = {'query':{'who':'John Doe'}}
t.equal(hello(doc, null_req), 'Hello, world', '"Hello world" by default')
t.equal(hello(doc, john_req), 'Hello, John Doe', 'Supports ?who query string')
t.end()
})
Проверьте это, запустив tap test
:
$ tap test
ok test/show_function.js ................................ 5/5
total ................................................... 5/5
ok
Я изменю код так, чтобы он возвращал жестко запрограммированный текст «Hello, world» (т.е. игнорировал параметр req.query.who
). Обратите внимание на неудачный тест:
$ tap test
not ok test/show_function.js ............................ 4/5
Command: "node" "show_function.js"
ok 1 No problem loading the app.js file
ok 2 Show function "hello" in the couch app
ok 3 "Hello world" by default
not ok 4 Supports ?who query string
---
file: /private/tmp/j/test/show_function.js
line: 23
column: 5
stack:
- getCaller (/private/tmp/j/node_modules/tap/lib/tap-assert.js:403:17)
- assert (/private/tmp/j/node_modules/tap/lib/tap-assert.js:19:16)
- Function.equal (/private/tmp/j/node_modules/tap/lib/tap-assert.js:160:10)
- Test._testAssert [as equal] (/private/tmp/j/node_modules/tap/lib/tap-test.js:86:16)
- Test.<anonymous> (/private/tmp/j/test/show_function.js:23:5)
- Test.<anonymous> (native)
- Test.<anonymous> (events.js:88:20)
- Test.emit (/private/tmp/j/node_modules/tap/lib/tap-test.js:103:8)
- GlobalHarness.<anonymous> (/private/tmp/j/node_modules/tap/lib/tap-harness.js:86:13)
- Array.0 (native)
found: Hello, world
wanted: Hello, John Doe
diff: |
FOUND: Hello, world
WANTED: Hello, John Doe
^ (at position = 7)
...
ok 5 test/show_function.js
1..5
# tests 5
# pass 4
# fail 1
total ................................................... 4/5
not ok