xgo:一个基于 IR 重写的 golang mock 库

242 天前
 xhd2015

最近基于工作需要,在使用了 gomonkey 遇到很多问题之后,并且也担心基于 Assembly 的方式对未来单测维护的不可持续性,开发了 xgo 。

xgo 基于 IR 中间码重写,更加贴近源代码而不是机器码。所以兼容性比 Assembly 要好很多,功能也更强。

下面是一个简单的示例:

package demo

import (
	"context"
	"testing"

	"github.com/xhd2015/xgo/runtime/core"
	"github.com/xhd2015/xgo/runtime/mock"
)

func MyFunc() string {
	return "my func"
}
func TestFuncMock(t *testing.T) {
	mock.Mock(MyFunc, func(ctx context.Context, fn *core.FuncInfo, args core.Object, results core.Object) error {
		results.GetFieldIndex(0).Set("mock func")
		return nil
	})
	text := MyFunc()
	if text != "mock func" {
		t.Fatalf("expect MyFunc() to be 'mock func', actual: %s", text)
	}
}

欢迎大家使用和提意见

项目地址 https://github.com/xhd2015/xgo

1242 次点击
所在节点    Go 编程语言
8 条回复
mightybruce
241 天前
行,关注了。
xhd2015
241 天前
说明一下:该 mock 不需要基于接口进行 monkey ,开箱可用😃
oceana
241 天前
点个赞
xhd2015
241 天前
@oceana 感谢,可以一起交流😌
sophos
241 天前
有点意思,和我这个项目的功能有点类似,不过实现思路不太一样 :-)

https://github.com/go-kod/kod
xhd2015
241 天前
@sophos 目标不一样,这个是单元测试场景,主打无代码侵入,无代码生成
sophos
241 天前
@xhd2015 嗯,我这个是为了优化代码模块设计,同时解决单元测试标准化的问题

不过个人感觉单元测试的最佳实践还是 mock interface ,patch 不够直观
xhd2015
241 天前
@sophos 哈哈,我持相反的看法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1027638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX