0

Meteor.collection.insert()接受callback作为参数。例如,可以创建一个全新的 Meteor 项目并在浏览器的控制台中运行以下代码。

my_collection = new Meteor.Collection("myCollection");
my_collection.insert(
    {some: "object"},
    function() {
        console.log("finished insertion");
    })

当我采用相同的代码并将其放入 Laika 测试时,该callback参数永远不会被调用。这是我的测试代码:

suite('testing Laika out', function() {
    test('inserting into collection', function(done, server, client) {
        client.eval(function() {
            my_collection = new Meteor.Collection("myCollection");
            my_collection.insert(
                {some: "object"},
                function() {
                    console.log("finished insertion");
                    done();
                })
        })
    })
})

有人知道为什么在这个 Laika 测试中没有调用回调函数吗?这似乎不仅仅是一个问题Meteor.collection.insert()

(我正在运行 Ubuntu 13.04、Meteor 0.7.0.1、Laika 0.3.1、PhantomJS 1.9.2-6)

4

2 回答 2

0

好吧,jonS90 先生,如果你用--verboseflag 运行 Laika,你会注意到一个异常正在悄悄地被抛出:

[client log] Exception in delivering result of invoking '/myCollection/insert': ReferenceError: Can't find variable: done

done()你看,在那种情况下你无权访问。以下是您应该如何修改代码:

test('inserting into collection', function(done, server, client) {
    client.eval(function() {
        my_collection = new Meteor.Collection("myCollection");

        finishedInsertion = function () {
            console.log("finished insertion");
            emit('done')
        }
        my_collection.insert(
            {some: "object"},
            finishedInsertion)
    })
    client.once('done', function() {
        done();
    })
})
于 2014-01-03T18:50:51.830 回答
0

问题是您试图done();在插入回调内部调用,而它在该函数范围内不存在。您实际上需要监听插入my_collection并发出由客户端或服务器(在您的情况下为客户端)接收的信号。此外,您显然不会在测试中初始化您的集合;这应该在您的生产代码中完成。

试试这个:

var assert = require("assert");

suite('testing Laika out', function() {
    test('inserting into collection', function(done, server, client) {

        client.eval(function() {
            addedNew = function(newItem) {
                console.log("finished insertion");
                emit("done", newItem)
            };
            my_collection = new Meteor.Collection("myCollection");
            my_collection.find().observe({
                added: addedNew
            });
            my_collection.insert(
                {some: "object"}
            )
        }).once("done", function(item) {
                assert.equal(item.some, "object");
                done();
            });
    });
})

查看https://github.com/arunoda/hello-laika以获取测试的基本示例。

于 2014-01-11T19:45:14.290 回答