2017-03-02 35 views
5

Tôi có một lớp học AProvider yêu cầu './b.provider'.Proxy yêu cầu không phân lớp của tôi yêu cầu

const BProvider = require('./b.provider'); 

class AProvider { 
    static get defaultPath() { 
    return `defaults/a/${BProvider.getThing()}`; 
    } 
} 

module.exports = AProvider; 

b.provider.js tiếp giáp với a.provider.js và trông giống như

global.stuff.whatever = require('../models').get('Whatever'); // I didn't write this! 

class BProvider { 
    static getThing() { 
    return 'some-computed-thing'; 
    } 
} 
module.exports = BProvider; 

Trong thử nghiệm của tôi, tôi sử dụng proxyquire để thử ra ./b.provider như sau:

import { expect } from 'chai'; 
import proxyquire from 'proxyquire'; 

describe('A Provider',() => { 
    const Provider = proxyquire('../src/a.provider', { 
    './b.provider': { 
     getThing:() => 'b-thing' 
    }, 
    }); 

    describe('defaultPath',() => { 
    it('has the expected value',() => { 
     expect(Provider.defaultPath).to.equal('defaults/a/b-thing') 
    }); 
    }); 
}); 

Tuy nhiên khi tôi chạy thử nghiệm BProvider được vẫn yêu cầu số thực tế './b.provider' không phải là tài liệu gốc và tài liệu tham khảo của BProvider là global.stuff.whatever đang ném lỗi.

Tại sao tính năng này không hoạt động?

+1

Bạn đã thử khai báo chỉ thị proxyquire trong câu lệnh 'before' chưa? Ngoài ra, không chắc chắn nếu điều này sẽ giúp, nhưng bài viết này dường như nghĩ rằng sử dụng sinon cùng với nó là cần thiết: http://www.thoughtdelimited.org/thoughts.cpostmfm/instructing-proxyquire-to-ignore-nested-requires –

+0

Thú vị liên kết. Tôi đã không nhận ra yêu cầu vẫn còn xảy ra mặc dù proxyquire. Trong một chiếc taxi ngay bây giờ nhưng sẽ kiểm tra một giải pháp khi tôi về nhà. Cảm ơn. –

+0

Được rồi, tôi đã giải quyết được vấn đề và đã tìm ra một giải pháp dễ dàng mà tôi sẽ đăng bài dưới đây. Cảm ơn @ francisco.preller đã chỉ cho tôi đúng hướng. –

Trả lời

4

Câu trả lời là tại sao điều này xảy ra là như sau

proxyquire vẫn đòi hỏi các mã cơ bản trước khi stubbing nó ra. Nó thực hiện điều này để kích hoạt các cuộc gọi.

Giải pháp chỉ đơn giản là để rõ ràng không cho phép gọi điện.

Xét nghiệm này trở thành:

import { expect } from 'chai'; 
import proxyquire from 'proxyquire'; 

describe('A Provider',() => { 
    const Provider = proxyquire('../src/a.provider', { 
    './b.provider': { 
     getThing:() => 'b-thing', 
     '@noCallThru': true 
    }, 
    }); 

    describe('defaultPath',() => { 
    it('has the expected value',() => { 
     expect(Provider.defaultPath).to.equal('defaults/a/b-thing') 
    }); 
    }); 
}); 

Chạy thử nghiệm này hoạt động hoàn hảo.

Các vấn đề liên quan