0

在此示例中,我正在使用lunit并尝试将实例方法注入到的实例中LuaSocket,但我无法理解为什么以下内容不起作用。

-- Using lunit for unit testing
local lunit = require('lunitx')
_ENV = lunit.module('enhanced', 'seeall')

local socket = require('socket')

-- connect(2) to the service tcp/echo
local conn, connErr = socket.connect('127.0.0.1', '7')

function conn:receiveLine(...)
    local line, err = self:receive('*l')
    assert_string(line, err)
    return line
end

function conn:sendLine(...)
    local bytesSent, err = self:send(... .. '\n')
    assert_number(bytesSent, err)
    return bytesSent
end

我收到的错误消息是:

attempt to call method 'sendLine' (a nil value)

?? 这似乎在这里发生了一些明显的事情,但我错过了所需的细节。

4

1 回答 1

0

Ass-u-me'ing getmetatable(conn).__index==getmetatable(conn)混乱之源。

在这种情况下,conn的元表的__index元方法指向的表与预期的不同,因此方法解析不会针对 的表进行getmetatable(conn)

function setup()
    -- Update the table at __index, not conn's metatable
    local mt = getmetatable(conn).__index

    function mt:receiveLine(...)
        local line, err = self:receive('*l')
        assert_string(line, err)
        return line
    end

    function mt:sendLine(...)
        local bytesSent, err = self:send(... .. '\n')
        assert_number(bytesSent, err)
        return bytesSent
    end
end

__index我可以通过测试看是否指向conn' 元表来梳理这一点,但事实并非如此:

assert_equal(getmetatable(conn), getmetatable(conn).__index)

通常,如果有一个__newindex处理程序getmetatable(conn)正在拦截新的表条目,请使用rawset()on__index的表。

于 2013-09-15T05:21:51.273 回答