【问题标题】:First async unit test with Mocha and Sinonjs第一次使用 Mocha 和 Sinonjs 进行异步单元测试
【发布时间】:2015-01-30 08:42:14
【问题描述】:

我实际上在使用一个由我的社会创建的微框架,我们在其中使用 Mongoose。

为了管理 mongoose 对象,我们创建了一个模型工厂,它返回一个与 mongoose 名称对象对应的模型。

实际上,我正在开发一个身份验证服务,我在其中注入了这个模型工厂。

我需要用 mocha 和 sinonjs 对其进行单元测试,但我有点迷茫......

这是我要测试的身份验证服务方法:

class AuthenticationService extends Service

  constructor: (modelFactory)->
    super(modelFactory)

    @authorizedClientIds = [
      "123456"
      "toto"
    ]
    @OAuthAccessTokensModel = @modelFactory.getSchema('OAuthAccessTokens')
    @OAuthClientsModel = @modelFactory.getSchema('OAuthClients')
    @OAuthUsersModel = @modelFactory.getSchema('OAuthUsers')
    @OAuthRefreshTokensModel = @modelFactory.getSchema('OAuthRefreshTokens')

  ## Get an access token from the bearer token ##
  getAccessToken: (bearerToken, callback)->
    @OAuthAccessTokensModel.findOne({accessToken: bearerToken}, callback)

module.exports = AuthenticationService

我想测试 getAccessToken 方法,但我显然不知道如何使它工作......

我试着做类似的东西:

describe("Authentication Service", function () {

    var service;

    before(function () {
        ModelFactory = use('/app/core/config/database/ModelFactory');

        var mock = sinon.mock(ModelFactory.getFactoryInstance([]));
        mock.expects("getSchema").withArgs("user").return({name:'user',getName:function(){}});

        service = new AuthenticationService(mock);
    });

    describe("getAccessToken", function () {
        it('should return-1 when the value is not present', function () {
            var proxy = once(service.getAccessToken());

            mock.verify();
        });
    });
});

我应该如何正确测试它?

编辑:

我尝试了一些东西,但测试起来似乎很奇怪,因为我提出了要比较的结果,但结果也是预期的..所以我永远不会通过测试:x...

describe("Authentication Service", function () {

    var service;

    before(function () {
        ModelFactory = use('/app/core/config/database/ModelFactory');
        var factory = new ModelFactory([]);
        sinon.stub(factory, "getSchema").returns({findOne: sinon.stub().returns()});
        service = new AuthenticationService(factory);
    });

    describe("getAccessToken", function () {
        it('Check if the access token correspond to a database entry', function () {
            stubResult = {token: '123456'};
            service.getAccessToken = sinon.stub().withArgs('1234').returns(undefined);
            assert.equal(service.getAccessToken(), undefined);
        });
    });
});

一些帮助?

感谢提前

【问题讨论】:

    标签: javascript node.js unit-testing sinon


    【解决方案1】:

    单元测试应该测试没有被模拟/存根的东西。

    当你有一个困难的方法 handleUnknownToken() 这个函数可以调用你的身份验证服务。 assert() 应验证“未定义”的处理是否按预期工作。
    换句话说:当你想单元测试时 f(x) = g()+h() +j();您可以通过存根 h() 和 j() 来测试 g() 的正确实现,通过存根 g() 和 j() 来测试 h() 以及通过存根 g() 和 h() 来测试 j()。

    编辑:上面的解释是抽象的,因为我不知道 Mongoose/Mocha/Sinonjs。下面我将尝试关注所描述的案例。

    当您的服务 getAccessToken() 完全被存根时,接下来的测试 当您的存根定义正确时将成功:

    testUnknown() {
       constant UKNOWN_ITEM='1234';
       assert.equal(service.getAccessToken(UNKNOWN_ITEM), undefined);
    }
    
    testTimeout() {
       constant DIFFICULT_ITEM='1235';
       assert.equal(service.getAccessToken(DIFFICULT_ITEM), STATUS_TIMEOUT);
    }
    
    
    testRevoked() {
       constant REVOKED_ITEM='1236';
       assert.equal(service.getAccessToken(REVOKED_ITEM), STATUS_DENIED);
    }
    
    testActive() {
       constant ACTIVE_ITEM='1237';
       assert.equal(service.getAccessToken(ACTIVE_ITEM), STATUS_OK);
    }
    

    您的测试必须包含一些您不会存根的逻辑。 调用 getAccessToken() 的代码是什么?类似函数的东西 isTokenOK(),它将查看状态并在超时后重试 5 次? 通过为上述测试实现的存根,您可以使用

    测试布尔函数 isTokenOK()
    testUnknown() {
       assertFalse(isTokenOK(UNKNOWN_ITEM));
    }
    
    testTimeout() {
       assertFalse(isTokenOK(DIFFICULT_ITEM));
    }
    
    
    testRevoked() {
       assertFalse(isTokenOK(REVOKED_ITEM));
    }
    
    testActive() {
       assertTrue(isTokenOK(ACTIVE_ITEM));
    }
    

    现在,当有人更改 isTokenOK() 的实现时,您的单元测试可能会失败。当单元测试失败时,你必须看看谁是对的。 可能在撤销后的前 10 分钟内可以使用已撤销的令牌进行身份验证,isTokenOK(REVOKED_ITEM) 应该为真。 哦,好吧,您必须为 REVOKED_ITEM_YESTERDAY 添加一个新测试。

    【讨论】:

    • 感谢您的解释。这对于简单的情况是很清楚的。你能把我的情况翻译成你的解释来帮助我理解更多吗?
    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多