2016-07-26 3 views
0

Использование ленты, как я могу написать собственный метод утверждения для использования вместо t.equal()? Или есть метод утверждения теста, который может проверять подстроку так, чтобы вся строка, которую я тестирую, не нужно сравнивать дословно, используя t.deepEqual()?Как написать пользовательское утверждение для тестирования узла или javascript с лентой или проверить подстроку, а не t.deepEquals()?

var test = require("tape") 

test('messages contain key words', function (t) { 
    // this is what I'm using: 
    t.equal(MyEncode(Fruit).indexOf('eat more') > -1,true,'should contain "eat more"') 

    // this is what I want: 
    t.contains(myEncode(Fruit),'eat more','should contain "eat more"') 
    t.end() 
}) 

Когда я испытываю myEncode, я могу видеть, что строка не содержит подстроку, но я не могу просмотреть фактическое значение, поскольку он оценивает только как ложное, который не является информативным:

not ok 1 should contain "eat more" 
--- 
    operator: equal 
    expected: true 
    actual: false 
    at: checkCmd (/test.js:63:11) 
... 

Из чтения тестового выхода выше, я не знаю, был ли мой тест слишком строгим, или выход был фактически неправильным. Вместо этого, я хотел бы видеть фактическое значение, возвращенное myEncode для ускорения локализации проблемы:

not ok 2 should contain "eat more" 
--- 
    operator: contains 
    expected: "eat more" 
    actual: "Apples are allowed to be eaten on weekdays and weekends" 
    at: checkCmd (/test.js:66:11) 
... 
+0

Я установил [extend-tape] (https://www.npmjs.com/package/extend-tape), но оказывается, что для него требуется функция 'import', которая еще не поддерживается V8, поэтому 'импортировать ленту из« ленты »; import addAssertions from 'extend-tape'; 'не работает. – user6641586

ответ

0

Я получил его на работу, благодаря @mbostock метода Примера испытания в вопросе How to define new test methods? #154 GitHub tape.

Функция для проверки, как правило, в другом файле (например, appToTest.js)

function brownFox(argument) { 
    return "The "+argument+" fox jumped" 
} 
exports.brownFox = brownFox 

Тестовый сценарий:

// Test module typically named test.js 
var test = require("tape") 

var f = require("./appToTest") 
// regular built-in test 

test('String must match exactly', function (t) { // can be too specific 
    t.deepEqual(f.brownFox('quick brown'), "The quick brown fox jumped") // should pass 
    t.deepEqual(f.brownFox('quick black'), "The quick brown fox jumped") // will fail 
    t.deepEqual(f.brownFox('quick white'), "The quick white fox jumped") // should pass 
    t.comment('Strings must be fully specified to match word for word') 
    t.end() 
}) 
// It can be too tedious to maintain the test string to always 
// match exactly the string in the code being tested 

// I don't care what the fox is as long as it jumped 
// Since there is no "contains" test in tape, I hack t.equal() 
test('String should contain a fox', function (t) { 
    // does not show actual value when test fails; shows true or false instead 
    // "jumped" must be tediously repeated to know what the test is about 
    t.equal(f.brownFox('quick brown').indexOf("jumped") > -1, true, "contains jumped") // should pass 
    t.equal(f.brownFox('quick black').indexOf("junped") > -1, true, "contains jumped") // should fail 
    t.comment('failures are not descriptive') 
    t.end() 
}) 
// Using equal() can result in more time spent fixing or adjusting the test 
// than coding the application 

// So define your own tape test method 
/////////////// Example of defining a custom tape test method 
test.Test.prototype.stringContains = function(actual, contents, message) { 
    this._assert(actual.indexOf(contents) > -1, { 
    message: message || 'should contain '+contents, 
    operator: 'stringContains', 
    actual: actual, 
    expected: contents 
    }); 
}; 

/////////////// Example using a custom tape test method 
test('String should contain a fox', function (t) { 
    // shows actual value when test fails 
    t.stringContains(f.brownFox('quick brown'), "jumped") // should pass 
    t.stringContains(f.brownFox('quick brown'), "junped") // should fail 
    // still supports custom message to override default message: 
    t.stringContains(f.brownFox('quick brown'), "jumped", 'must contain "jumped"') // should pass 
    t.stringContains(f.brownFox('quik white'), "jumped") // should pass 
    t.comment('failures are more descriptive') 
    t.end() 
}) 

Обратите внимание, что настроен выход теста теперь сообщает «подлинноe» строка :

TAP version 13 
# String must match exactly 
ok 1 should be equivalent 
not ok 2 should be equivalent 
    --- 
    operator: deepEqual 
    expected: 'The quick brown fox jumped' 
    actual: 'The quick black fox jumped' 
    at: Test.<anonymous> (./tape-test.js:9:7) 
    ... 
ok 3 should be equivalent 
# Strings must be fully specified to match word for word 
# String should contain a fox 
ok 4 contains jumped 
not ok 5 contains jumped 
    --- 
    operator: equal 
    expected: true 
    actual: false 
    at: Test.<anonymous> (./tape-test.js:23:7) 
    ... 
# failures are not descriptive 
# String should contain a fox 
ok 6 should contain jumped 
not ok 7 should contain junped 
    --- 
    operator: stringContains 
    expected: 'junped' 
    actual: 'The quick brown fox jumped' 
    at: Test.test.Test.stringContains (./tape-test.js:33:8) 
ok 8 must contain "jumped" 
ok 9 should contain jumped 
# failures are more descriptive 

1..9 
# tests 9 
# pass 6 
# fail 3 

Я установил extend-tape, а потом понял, что я бы использовать его с babel, потому что V8 еще не поддерживает импорт, но я не хотел добавлять babel в качестве зависимости.

Поскольку код выше работает, я не вижу смысла использовать extend-tape.