gpt4 book ai didi

c# - 模拟内部对象的事件不会触发?

转载 作者:行者123 更新时间:2023-11-30 17:56:14 30 4
gpt4 key购买 nike

使用 Moq 和两个接口(interface),OuterInner,我无法获得 Outer.Inner.SomeEvent 开火。

public interface Outer
{
Inner Inner { get; }
}

public interface Inner
{
int Prop { get; set; }
event EventHandler PropChanged;
}

public void Test()
{
Mock<Outer> omock = new Mock<Outer>();
Mock<Inner> imock = new Mock<Inner>();

Console.WriteLine("Inner");
imock.Object.PropChanged += InnerPropChanged;
imock.Raise(m => m.PropChanged += null, EventArgs.Empty);
imock.Object.PropChanged -= InnerPropChanged;

// This has no effect.
//omock.Setup(m => m.Inner).Returns(imock.Object);

Console.WriteLine("Outer");
// Both the auto recursive and the explicit above produce the same behavior.
omock.SetupProperty(m => m.Inner.Prop, -1);
omock.Object.Inner.PropChanged += InnerPropChanged;
omock.Raise(m => m.Inner.PropChanged += null, EventArgs.Empty);
}

public void InnerPropChanged(object sender, EventArgs e)
{
Console.WriteLine(" InnerPropChanged");
}

调用 Test() 时的输出:

Inner
InnerPropChanged
Outer

如何提醒订阅者注意 Inner 的任何事件?似乎没有什么能够解雇他们。

编辑 - 澄清一下,我希望能够从 Outer 上下文中引发 Inner 事件,因此最终输出应包括:

Outer
InnerPropChanged

最佳答案

可能是表达式的错误或缺少的功能

omock.Raise(m => m.Inner.PropChanged += null, EventArgs.Empty);

不工作...但是您可以使用 Mock.Get 获取生成的 Inner 模拟,然后您可以在其上引发事件:

public void Test()
{
Mock<Outer> omock = new Mock<Outer>();
Console.WriteLine("Outer");
omock.SetupProperty(m => m.Inner.Prop, -1);
omock.Object.Inner.PropChanged += InnerPropChanged;
Mock.Get(omock.Object.Inner)
.Raise(m => m.PropChanged += null, EventArgs.Empty);
}

产生你想要的输出:

Outer
InnerPropChanged

关于c# - 模拟内部对象的事件不会触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386540/

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