You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不修改外部代码时测试依赖私有对象顺序的GoFish方法?

解决GoFish项目中测试时设置readonly Deck的问题

针对你遇到的无法在测试中设置GameState.Stock(readonly的Deck实例)的问题,有几种不用修改生产代码的方案:

1. 用反射直接修改readonly字段

C#的反射机制可以绕过readonly修饰符的限制,在运行时修改私有/只读字段。你可以在测试代码里写一段反射逻辑,找到GameState中的Stock字段,然后把你预设好顺序的Deck实例赋值给它。

示例代码:

// 假设你已经创建了GameController和GameState实例
var gameState = gameController.GameState; // 或通过反射获取GameController内的GameState字段
Type gameStateType = typeof(GameState);
FieldInfo stockField = gameStateType.GetField("Stock", BindingFlags.NonPublic | BindingFlags.Instance);
stockField.SetValue(gameState, yourPredefinedDeck);

这种方式属于白盒测试,依赖类的内部实现细节,后续生产代码如果修改字段名或结构,测试会失效,但确实能满足你当前不修改生产代码的需求。

2. 使用VS测试框架的PrivateObject类

如果你用的是Visual Studio自带的单元测试框架,可以用PrivateObject类简化私有成员的访问和修改,不用自己写复杂的反射代码:

var privateGameState = new PrivateObject(gameState);
privateGameState.SetField("Stock", yourPredefinedDeck);

这个类封装了反射逻辑,写法更简洁,适合快速编写测试。

额外建议:重构时考虑依赖注入(可选)

虽然你现在不能修改生产代码,但如果后续允许重构,最优方案是通过依赖注入实现松耦合。比如让GameController的构造函数接收一个Deck实例,或者一个负责创建Deck的工厂接口,这样测试时直接传入预设好顺序的Deck,不需要依赖反射。这种方式属于黑盒测试,更健壮,也符合面向对象的设计原则。

内容的提问来源于stack exchange,提问作者Collyn Brenner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:48:46