调度程序没有在开玩笑的单元测试中注册回调
Posted
技术标签:
【中文标题】调度程序没有在开玩笑的单元测试中注册回调【英文标题】:Dispatcher not registering callbacks in jest unit tests 【发布时间】:2015-03-08 10:44:00 【问题描述】:我正在为 react+flux 应用程序中的商店编写单元测试。我按照设置mock dispatcherhere的例子,我的单元测试是这样的:
jest.dontMock "../../app/scripts/stores/item_store.coffee"
jest.dontMock "object-assign"
describe 'ItemStore', ->
ShopConstants = require "../../app/scripts/constants/shop_constants.coffee"
ShopDispatcher = undefined
ItemStore = undefined
callback = undefined
actionBuildQueryString =
source: "VIEW_ACTION"
action:
type: ShopConstants.ActionTypes.BUILD_QUERY_STRING
size: "4"
actionReceiveFilterRespData =
source: "SERVER_ACTION"
action:
type: ShopConstants.ActionTypes.RECEIVE_FILTER_RESP_DATA
data: item:
beforeEach ->
ShopConstants = require "../../app/scripts/constants/shop_constants.coffee"
ShopDispatcher = require "../../app/scripts/dispatchers/shop_dispatcher.coffee"
ItemStore = require "../../app/scripts/stores/item_store.coffee"
callback = ShopDispatcher.register.mock.calls[0][0]
it "registers a callback with the dispatcher", ->
expect(ShopDispatcher.register.mock.calls.length).toBe(1)
在我的 item_store.coffee 文件中,我向调度员这样注册:
ShopDispatcher.register (payload) ->
action = payload.action
switch action.type
when ActionTypes.BUILD_QUERY_STRING
WebApiUtils.fetchItems(payload)
when ActionTypes.RECEIVE_FILTER_RESP_DATA
_setItems(action.data)
ItemStore.emitChange()
我希望模拟的 Dispatcher 注册回调,因为这发生在实际的 item_store 文件中,我告诉 jest 不要模拟。但是,由于 ShopDispatcher.register 是未定义的,它没有被注册,但我不太清楚为什么。任何帮助表示赞赏。
【问题讨论】:
期望(ShopDispatcher.register.mock.calls.length).toBe(1) 失败吗?我对 CoffeeScript 语法不是很熟悉,但是您在 beforeEach 中的要求是否正确覆盖了您在描述开头声明的 ShopDispatcher?如果没有 var 关键字,我不确定范围内的内容。还是在您的商店中未定义注册?如果是这样,我们可能需要查看更多您的商店代码。 它应该覆盖开头的ShopDispatcher = undefined
。它是 var cat;
cat = "cat";
的咖啡脚本等价物,无论如何,在文件顶部使用 jest.mock "../../app/scripts/dispatchers/shop_dispatcher.coffee"
显式模拟调度程序会导致测试通过。我相信需要 ShopDispatcher 是需要不具有属性 Shop.register.mock 的实际 ShopDispatcher 导致此测试失败。我将更深入地研究笑话并编写更多测试。感谢您的帮助!
【参考方案1】:
我也遇到了同样的问题。而不是使用ShopDispatcher.register.mock.calls[0][0]
尝试ShopDispatcher.dispatch
。下面的代码非常适合我(使用类型脚本)。
beforeEach(function ()
dispatcher = require("../../../src/App/Dispatcher");
localeStore = require("../../../src/stores/localestore");
localeAction = require("../../../src/actions/Locale/LocaleAction");
it("should translate the element with the value in current locale JSON", function ()
localeChangeAction = new localeAction(true, locale, localeJson);
dispatcher.dispatch(localeChangeAction);
var translatedText = localeStore.instance.TranslateText("login.login-header");
expect(translatedText).toEqual("Login header");
);
【讨论】:
以上是关于调度程序没有在开玩笑的单元测试中注册回调的主要内容,如果未能解决你的问题,请参考以下文章