【问题标题】:Get Mongo Collection in Meteor velocity test在 Meteor 速度测试中获取 Mongo Collection
【发布时间】:2015-03-29 01:36:52
【问题描述】:

目前我正在做一个流星项目,我在其中编写了一些包。现在我在为这些包编写测试代码时遇到了问题。 我在 Velocity 中使用了 mike:mocha。

在包中,我使用以下方法创建了一个集合:

    TestCollect = new Meteor.Collection("testCollect");

在我的 package/server.js 中

    if(TestCollect.find().count == 0){
        TestCollect.insert({});
    }
    ... /*I want to make sure there is only doc in this collection */

然后我在 package.js 中导出这个变量

    api.export("TestCollect");

在我的服务器测试代码中,就像:

    it("should contain only one doc", function(){
            console.log(TestCollect.find());
            chai.assert.equal(1, TestCollect.find().count(), "but it has " + TestCollect.find().count() + " docs");
        });

令我惊讶的是,测试代码中的数据库似乎与我的包中的数据库完全不同。我猜速度使用镜像 mongo 来运行测试代码。

其实console.log(TestCollect.find());在我的测试代码中返回:

    I20150102-08:44:13.285(8)? [velocity-mirror] { _mongo: 
    I20150102-08:44:13.285(8)?    { _connectCallbacks: [ [Function] ],
    I20150102-08:44:13.285(8)?      _observeMultiplexers: {},
    I20150102-08:44:13.285(8)?      _onFailoverHook: { nextCallbackId: 0, callbacks: {}                         },
    I20150102-08:44:13.286(8)?      _docFetcher: { _mongoConnection: [Circular],         _callbacksForCacheKey: {} },
    I20150102-08:44:13.286(8)?      _oplogHandle: 
    I20150102-08:44:13.286(8)?       { _oplogUrl: 'mongodb://127.0.0.1:3001/local',
    I20150102-08:44:13.286(8)?         _dbName: 'mocha',
    I20150102-08:44:13.286(8)?         _oplogLastEntryConnection: [Object],
    I20150102-08:44:13.286(8)?         _oplogTailConnection: [Object],
    I20150102-08:44:13.286(8)?         _stopped: false,
    I20150102-08:44:13.286(8)?         _tailHandle: [Object],
    I20150102-08:44:13.287(8)?         _readyFuture: [Object],
    I20150102-08:44:13.287(8)?         _crossbar: [Object],
    I20150102-08:44:13.287(8)?         _lastProcessedTS: [Object],
    I20150102-08:44:13.287(8)?         _baseOplogSelector: [Object],
    I20150102-08:44:13.287(8)?         _catchingUpFutures: [] },
    I20150102-08:44:13.287(8)?      db: 
    I20150102-08:44:13.287(8)?       { domain: null,
    I20150102-08:44:13.288(8)?         _events: {},
    I20150102-08:44:13.288(8)?         _maxListeners: 10,
    I20150102-08:44:13.288(8)?         databaseName: 'mocha',
    I20150102-08:44:13.288(8)?         serverConfig: [Object],
    I20150102-08:44:13.288(8)?         options: [Object],
    I20150102-08:44:13.288(8)?         _applicationClosed: false,
    I20150102-08:44:13.288(8)?         slaveOk: false,
    I20150102-08:44:13.289(8)?         bufferMaxEntries: -1,
    I20150102-08:44:13.289(8)?         native_parser: false,
    I20150102-08:44:13.289(8)?         bsonLib: [Object],
    I20150102-08:44:13.289(8)?         bson: [Object],
    I20150102-08:44:13.289(8)?         bson_deserializer: [Object],
    I20150102-08:44:13.289(8)?         bson_serializer: [Object],
    I20150102-08:44:13.289(8)?         _state: 'connected',
    I20150102-08:44:13.290(8)?         pkFactory: [Object],
    I20150102-08:44:13.290(8)?         forceServerObjectId: false,
    I20150102-08:44:13.290(8)?         safe: false,
    I20150102-08:44:13.290(8)?         notReplied: {},
    I20150102-08:44:13.291(8)?         isInitializing: true,
    I20150102-08:44:13.291(8)?         openCalled: true,
    I20150102-08:44:13.291(8)?         commands: [],
    I20150102-08:44:13.291(8)?         logger: [Object],
    I20150102-08:44:13.291(8)?         tag: 1420159452700,
    I20150102-08:44:13.292(8)?         eventHandlers: [Object],
    I20150102-08:44:13.292(8)?         serializeFunctions: false,
    I20150102-08:44:13.292(8)?         raw: false,
    I20150102-08:44:13.292(8)?         recordQueryStats: false,
    I20150102-08:44:13.292(8)?         retryMiliSeconds: 1000,
    I20150102-08:44:13.292(8)?         numberOfRetries: 60,
    I20150102-08:44:13.293(8)?         readPreference: [Object] },
    I20150102-08:44:13.293(8)?      _primary: '127.0.0.1:3001' },
    I20150102-08:44:13.293(8)?   _cursorDescription: 
    I20150102-08:44:13.293(8)?    { collectionName: 'kliuStatus',
    I20150102-08:44:13.293(8)?      selector: {},
    I20150102-08:44:13.293(8)?      options: { transform: null } },
    I20150102-08:44:13.293(8)?   _synchronousCursor: null }

那么我应该如何让这个测试代码工作呢?有什么方法可以连接到“真正的”mongo?

【问题讨论】:

  • 你在测试什么?看起来您正在测试 Meteor 的 MongoDB API 是否有效。 Don't unit test other people's code.
  • @sbking ,嗨,我粘贴的代码只是一个演示。我需要测试从我的包中写入 Mongo 集合的数据确实是我想要写入的数据。所以我使用我的包插入数据,然后我想检查它是否真的进入了mongo。但目前我无法在我的测试代码中获得正确的 mongo db。

标签: meteor meteor-velocity


【解决方案1】:

您是对的,测试在镜像中运行并在不同的数据库上执行。

您在每个测试中应该做的是设置该测试所需的数据库。因此,当您编写测试时,您应该执行一些与此类似的步骤(未经测试的代码):

describe('the suite'), function() {

    beforeEach(function() {
       myCollection.remove({});
    });

    it('should add something to some document', function() {
        // SETUP
        myCollection.insert({some: "document"});

        // EXECUTE
        myCode.addSomething({hello: "world"});

        // VERIFY
        myDoc = myCollection.find({some: "document"});
        assert(myDoc.hello === "world");
    }

});

您可以在 mocha here 中查看更多关于 hooks 的信息

https://github.com/Sanjo/meteor-jasmine/blob/master/specs/example.js

【讨论】:

  • 谢谢,能否请您给我更多的说明如何做到这一点?目前我已经在客户端和服务器共享的js中清除了一个集合,只有服务器加载的js会做一些数据工作。在我将这个包添加到我的流星项目中后,所有这些都会自动完成。那么我怎样才能将包“添加”到我的测试项目中,并使所有数据都在我的测试项目中工作呢?
  • 我不确定我是否理解“测试项目”是什么。您在应用程序中拥有的包与您在镜像中获得的包相同。这能回答你的问题吗?
  • 我写的包会自动创建一个集合,并在里面添加一些数据。所以我认为当我的 mocha 测试代码运行时,它会在“镜像”mongo 数据库中执行相同的操作。我编写了测试代码来检查这一点,以确保我的包按我想要的方式工作。
【解决方案2】:

我遇到了一个非常相似的问题,并在我意识到我没有使用 Meteor.subscribe 时解决了这个问题。我怀疑如果您将以下代码添加到您的客户端:Meteor.subscribe("TestCollect")mike:mocha 将正常工作。

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多