【问题标题】:Unit testing a moonscript awesome config单元测试一个moonscript真棒配置
【发布时间】:2015-07-20 04:07:08
【问题描述】:

我想要学习一些 lua/moonscript 的方法是将我很棒的配置文件 (rc.lua) 迁移到 moonscriptunit-test 沿途的一些东西。为此,我将 rc.lua 设置为需要这样的 moonscript 配置文件

package.path = pathsToAdd .. package.path
-- a bit of a hassle to amend the lua require paths
-- correctly; I boldly assume for now that these are not the
-- cause of the problem
require('moonscript')
require('config')

对于第一个单元测试,检查我的配置是否调用了模块“齿轮”的特定功能,一切都相当顺利。我最终嘲笑了每次后续调用的 gears 模块

require('gears')

通过像这样设置单元测试

package.loaded.gears = myMockVersion

快进到当我的测试配置文件需要“糟糕”模块时: 它的 init.lua 被调用,立即执行

return
{
    client = require("awful.client");
    ...
}

这导致 client.lua 做

...
local tag = require("awful.tag")
...
local client = {}
-- define lots of functions, register some signal handlers
return client

现在,对于仍在阅读的每个人来说,tag.lua 中的问题:

...
local capi =
{
    ...
    client = client,
    ...
}
...
capi.client.connect_signal(...)

最后一次调用抛出一个好旧的

attempt to index a nil value (field 'client')

我认为这是因为 client.lua 还没有通过最初的几个 require 调用,因此在全局范围内根本不可用,或者至少还没有定义它的功能。
最后,这让我想到了一个问题:

为什么这甚至会在你日常的启动过程中运行(糟糕的几乎是核心模块),以及在尝试复制它所在的环境时我错过了什么。

非常感谢您。
真心的

【问题讨论】:

    标签: lua awesome-wm moonscript


    【解决方案1】:

    awesome 的 C 核心导出一些对象供 lua 使用。糟糕的(以及许多其他人)直接使用这些。这些都在很棒的 3.5 中(参见 https://awesome.naquadah.org/doc/api/):

    • 标签
    • 定时器
    • 绘图
    • keygrabber
    • 可绘制
    • 鼠标
    • 客户
    • 屏幕
    • 太棒了
    • 鼠标抓取器
    • 选择
    • dbus
    • 按钮

    其中大多数都在可怕的包装器中添加了有用的东西(例如,密钥与可怕的密钥,标签、keygrabber、按钮相同)。其他东西对“普通用户”完全隐藏(例如 drawin、drawable)。

    您也应该能够模拟这些,但您必须设置具有相同名称的全局变量。

    编辑:顺便说一句,这就是为什么你不能在普通的 lua 提示中require("awful")。缺少相同的内置对象。

    【讨论】:

    • 太好了,直截了当的回答……与此同时,在阅读了一些很棒的资料后,我自己想出了答案的粗略部分。我的进一步方法很可能是模拟所有内容。
    • 为此,存储在 '_G' 中的全局上下文可以用类似 'rawset _G, 'moduleToBeMocked', mockVersion' 之类的东西进行修改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多