0

坚持这个。

我正在使用laravel elxirtsify来生成我的 js。我通过 factor-bundle 运行 typescript 以将常见的 js 模块拆分为单独的文件。我认为在这种情况下这不会成为问题,因为一切都在 spec.js 中

规格

/// <reference path="../../../typings/index.d.ts" />
import "jasmine-jquery";
// @start widgets
import "./widgets/common/widget-factory/test";

工厂小部件/index.ts

export class WidgetFactory {
 .... this contains a require call to browser.service which i need to mock
}

工厂小部件/test.ts

...
import {WidgetFactory} from "./index";
const proxyRequire =  require("proxyquire");

  it("should output the factory items", ()=> {

        proxyRequire('./widgets/browser.service/index',{
            "@global": true,
   });
}

浏览器服务.ts

...
export class BrowserService implements IBrowserService{
 //details
}

在第 262 行出现错误Uncaught TypeError: require.resolve is not a function

这是代码(是的,它超过 20,000 行)您还应该如何调试这些东西。¯_(ツ)_/¯

用 proxyquire 看过 Stubbing。我没有屏住呼吸来回答这个问题。

编辑:06-09-2016 Proxquire 需要覆盖 WidgetFactory 类的 boot 方法中的 require 调用

在工厂小部件/index.ts 中:

boot(output = true):any {
        let required = {};

        if (this._sorted.length) {
            this._sorted.forEach((key)=> {
                if (output) {
                    console.log(`${this._path}${key}/index`);
                    // this is where is need to overide the call to require. 
                    required[key] = require(`${this._path}${key}/index`);
                }
            });

            this._sorted.forEach((key)=> {

                let dependencies = {},
                    module = this._factory[key];

                if (module.hasOwnProperty(this.dependencyKey)) {
                    module[this.dependencyKey].map((key)=> {
                        dependencies[_.camelCase(key)] = this.isService(module) ? new required[key] : key;
                    });
                }

                if (this.isTag(module)) {
                    if (output) {
                        document.addEventListener("DOMContentLoaded", ()=> {
                            riot.mount(key, dependencies);
                        });
                    }
                    //console.log(key,dependencies);
                }
                else {

                }
            })
        }
    }
4

1 回答 1

0

我在GitHub 存储库中添加了一个proxyquireify示例。它tsify基于. _proxyquireify README.md

require重要的部分是对调用proxyquire的重新定义foo-spec.ts

const proxyquire = require('proxyquireify')(require);
require = function (name) {
    const stubs = {
        './bar': {
            kinder: function () { return 'schokolade'; },
            wunder: function () { return 'wirklich wunderbar'; }
        }
    };
    return proxyquire(name, stubs);
} as NodeRequire;

proxyquire插件的配置build.js

browserify()
    .plugin(tsify)
    .plugin(proxyquire.plugin)
    .require(require.resolve('./src/foo-spec.ts'), { entry: true })
    .bundle()
    .pipe(process.stdout);

如果您bundle.js在 Node.js 下构建并运行它,您应该会看到写入控制台的消息包括由存根./bar模块中的函数返回的字符串。

于 2016-09-06T08:03:37.937 回答