gpt4 book ai didi

c# - Moq 是否与 PrivateObject 不兼容?

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:33 24 4
gpt4 key购买 nike

我正在尝试在模拟对象上测试私有(private)方法。请冷静下来,我知道您正在拔干草叉。

我很清楚要说的一切都可以通过对我大喊 REFACTOR 来回答。我只需要一个直接的答案。有人看着我的眼睛告诉我这是不可能的。这是一个无法用谷歌搜索的问题,所以我只需要听听即可。

这是我正在处理的。

public class SecretManager
{
protected virtual string AwfulString { get { return "AWFUL, AWFUL THING"; }

public SecretManager()
{
//do something awful that should be done using injection
}

private string RevealSecretMessage()
{
return "don't forget to drink your ovaltine";
}
}

这是我在尝试测试它。

var mgr = new Mock<SecretManager>();
mgr.Protected().SetupGet<string>("AwfulThing").Returns("");

var privateObj = new PrivateObject(mgr.Object);
string secretmsg = privateObj.Invoke("RevealSecretMessage");

Assert.IsTrue(secretmsg.Contains("ovaltine"));

和异常:

System.MissingMethodException: Method 'Castle.Proxies.SecretManagerProxy.RevealSecretMessage' not found

我想做的事,尽管很疯狂,有可能吗?还是这对于单元测试来说太狂妄自大了?

最佳答案

您正在尝试调用 CaSTLe 创建的代理上的方法。代理将无法访问它继承自的类的私有(private)方法,因为该方法是私有(private)的。请记住,CaSTLe.Proxies.SecretManagerProxy 实际上是 SecretManager 的子类。

您真的需要模拟 SecretManager 吗?我意识到您的代码是真实代码的精简摘要,但似乎您对模拟所做的唯一事情就是为您尝试测试的方法未使用的属性设置返回值.

关于c# - Moq 是否与 PrivateObject 不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com