簡體   English   中英

如何在requirejs的測試中注入模塊到單元測試應用程序?

[英]How to inject module in test for requirejs to unit test application?

我有兩個模塊,ModuleA 和 ModuleB。 ModuleB 依賴於 ModuleA。 但據我所知,requirejs 是一種服務定位器。 那么我如何在我的代碼中對這種模式進行單元測試。

define('moduleA', function() {
    var ModuleA = function() {
        this.doSomething = function() {
            return true;
        }
    }
    return ModuleA;
});

define('moduleB', ['moduleA'], function(ModuleA) {
    var moduleA = new ModuleA();
    var ModuleB = function() {
        this.doSomethingElse = function() {
            if(moduleA.doSomething()) {
                // do something else and return

            } else {
                // do other things and return
            }
        }
    }

    return ModuleB
});

/*Test for moduleB*/
define('test', ['moduleB', function(ModuleB) {
    describe('', function() {
        var moduleB = new ModuleB();
        expect(moduleB.doSomethingElse()).toBe(true);
    });
});

因為 ModuleA 會一直被初始化。 無論如何,我可以向 ModuleB 注入一些模擬並進行測試嗎? 而且我不想使用單例,因為我不確定測試是否會因為不可預見的行為而繼續失敗。

注意:我只是輸入代碼,所以它們可能是一些編譯錯誤。

此代碼模式不可單元測試。 我想有人可以想出一種方法來欺騙 RequireJS 加載不同的模塊定義並在測試結束時卸載它,但這太復雜且太容易出錯,並且無法解決糟糕的編碼實踐問題。

該模式不可測試,因為在 moduleB 定義內部,您正在創建 moduleA 的新實例(加上 ModuleA 的加載是“硬編碼”)。 要使其可測試,您需要注入它。 考慮這樣的事情:

define('moduleB', function() {
    var ModuleB = function(moduleA) {
        this.__moduleA = moduleA;
        this.doSomethingElse = function() {
            if(this.__moduleA.doSomething()) {
                // do something else and return

            } else {
                // do other things and return
            }
        }
    }

    return ModuleB
});

為了進一步探索這個小重構,我建議閱讀“依賴注入”。 跳過像Guice這樣的DI工具,直接進入DI思想的核心。

Misko Hevery 有幾篇關於這種 OOP 模式的有趣帖子,包括如何處理“new”關鍵字: http : //misko.hevery.com/2008/09/10/where-have-all-the-new-operators-走了/

我現在找不到它,但我相信 Misko 有關於 OOP 中的 3 個層次結構的好帖子,繼承層次結構(最明顯),創建層次結構(誰創建了什么)和依賴層次結構(誰使用誰)。 這3個層次是完全不同的。 通常,如果 B 類創建 A 類,則不應使用它。 B 類的角色似乎是一個工廠——它創建實例。 應該有一些其他類 C 正在使用類 A 的注入實例來執行一些業務邏輯。

附帶說明一下,既然您已經在使用 AMD 模塊和 JS“類”,為什么不讓您的類/對象看起來和行為更像正確的 OOP 類/對象? Dejavu 可以幫助您: http : //wojciechszela.com/blog/2014/01/13/object-oriented-programming-in-javascript/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM