2016-08-21 57 views
3

在丹Schafer的陣營歐洲交談(https://youtu.be/etax3aEe2dA?t=11m5s),他表現一種方法在一個GraphQL服務器處理授權可委託給商業邏輯層,其中每個業務對象類有一個gen() function充當「單一來源的真相「取得和授權如何在靜態函數中測試封裝自己創建的JavaScript ES6類?

他暗示這些類可能沒有公共構造函數,從而使gen()成爲實例化這些類之一的唯一方法。

作爲一個C#開發,這不會[容易]單元測試。也許,我從字面上理解他的例子。

在ES2015中,是否有可能用這種模式單獨測試業務邏輯?如果是這樣,你能舉個例子嗎?


這裏有一個相關的Q & A,但它並不完全解決我的問題:

問:With GraphQL, what is the benefit or necessity of declaring a backing model "class" that does not vary from the GraphQL "Type" in any obvious way?

答:https://stackoverflow.com/a/38209996/6439734

回答

4

我會帶會有所不同的方法取決於我試圖測試的內容:

  • 如果我試圖單元測試自己的授權邏輯,那麼我幾乎肯定會將這種邏輯分解成如下形式:Code sample from slide from Dan Schafer React Europe 2016 Talk現在,我將單獨測試checkCanSee,並傳入僞造的Viewer對象和僞造數據。

  • 如果我試圖單元測試這個類的一個實例方法的邏輯;比方說,如果我們有 class TodoItem { getItemSummary() { return this.data.title + "(" + this.data.author.name + ")"; } } 並且我想單元測試那個邏輯,有幾個選項。在ES6中,我沒有意識到讓構造函數實際上是私有的簡單方法,所以我可以直接在我的單元測試中用假數據調用構造函數。在另一種語言中,我希望能夠公開一個只有通過單元測試才能看到的方法,它可以讓我用假數據構造一個新對象。第三個想法是提取單元測試值得邏輯: class TodoItem { getItemSummary() { return summarize(this.data.title, this.data.author.name); } } function summarize(title, name) { return title + "(" + name + ")"; } 現在我可以單獨測試summarize

  • 如果我試圖對整個班級進行端到端測試(其中包括測試gen函數),那麼我最好有一種方法來設置Redis的Shimmed實例;一旦我用我的假數據配置了這個墊​​片,我就可以運行真正的TodoItem.gen並測試結果對象。

  • 如果我想單元測試的gen實施,我可能需要使用相同的Redis的墊片上面,同樣安裝的checkCanSee仿版,使用類似https://facebook.github.io/jest/docs/manual-mocks.html;從那裏,我可以偵測到Redis和checkCanSee的電話以確保它們符合預期,並測試Redis返回數據/返回null或checkCanSee返回true/false的各種情況。

  • 如果我想的是消耗TodoItem(說,我們有需要TodoItem作爲自變量的函數renderTodoItem),我不會用真正的TodoItem實現在所有的,我會在模擬通過單元測試代碼TodoItem以確保我的單元測試renderTodoItem不會意外地依賴於TodoItem的實現細節。

希望這有助於!

+0

感謝您提供的信息......建議您在內部用戶和外部用戶之間獲取數據獲取的單一來源?因爲兩者都有不同的授權邏輯......並且可以看到不同的事物並執行不同的突變 – Stanley

相關問題