调度程序没有在开玩笑的单元测试中注册回调

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");
);

【讨论】:

以上是关于调度程序没有在开玩笑的单元测试中注册回调的主要内容,如果未能解决你的问题,请参考以下文章

对调度程序进行单元测试有哪些策略?

开玩笑的单元测试不会等待 axios 响应

开玩笑的带有 expo sqlite 调用的单元测试类

开玩笑单元测试返回“MongoError:拓扑被破坏”

如果调用 super() 则开玩笑的单元测试

createWriteStream 的 ('error') 上的开玩笑单元测试