gpt4 book ai didi

c# - 如何使用内部构造函数模拟事件

转载 作者:行者123 更新时间:2023-11-30 22:39:45 24 4
gpt4 key购买 nike

我有一项服务负责订阅 EWS 以获取新邮件通知。我已经为该服务创建了一个接口(interface),以便模拟它并测试虚拟实现。但是,每当我尝试手动告诉我的事件应该做什么时,我都会遇到困难。

这是我的具体实现。

public interface IExchangeService
{
void Subscribe();
}

public class ExchangeServiceSubscriber : IExchangeService
{
private readonly ExchangeService _exchangeService;
private readonly IConsumer<IEmail> _consumer;

public ExchangeServiceSubscriber(
ExchangeService exchangeService,
IConsumer<IEmail> consumer)
{
_exchangeService = exchangeService;
_consumer = consumer;
}

public void Subscribe()
{
// code to subscribe

streamingConnection.OnNotificationEvent += OnEvent;

streamingConnection.Open();
}

public void OnEvent(object sender, NotificationEventArgs args)
{
foreach (NotificationEvent triggeredEvent in args.Events)
{
if (triggeredEvent is ItemEvent)
{
var propertySet = new PropertySet(ItemSchema.UniqueBody, ItemSchema.Attachments)
{
RequestedBodyType = BodyType.Text
};
EmailMessage email = EmailMessage.Bind(args.Subscription.Service,
((ItemEvent)triggeredEvent).ItemId, propertySet);

_consumer.Consume(new ExchangeEmail { Body = email.UniqueBody });
}
}
}
}

不幸的是,似乎 EWS 中的几乎每个类都是密封的或有一个内部构造函数,这确实限制了我如何解耦它们。我试图为 NotificationEventArgs 设置期望值(例如),但它使用了内部构造函数。

这是我一直在摆弄的一些想法。您可以阅读有关模拟事件的信息 here .

mock.Setup(x => x.OnEvent(new object(), new NotificationEventArgs()));问题是 NotificationEventArgs 使用内部构造函数。

我可以看到它与某种包装器一起工作,但我不确定它会是什么样子。最大的问题之一是 EWS 的制作方式几乎阻止了任何人手动注入(inject)依赖项。我基本上是在尝试测试,无论何时 OnEvent 事件触发,电子邮件实际上都会被消耗掉。此外,虽然我想测试此功能,但我不确定是否值得在整个过程中的每一步都与 EWS 作斗争。

最佳答案

让我们先看看,你不能做什么:

  • 您不能将 NotificationEventArgs 子类化,因为构造函数是内部的。
  • 出于同样的原因,您不能直接创建实例。

所以基本上,您不能使用“正常方式”创建此类的实例。我假设您已经检查了工厂方法或类?

这让我们只有一个选择:使用反射实例化类,例如在 Activator.CreateInstance 方法的帮助下:Unit testing exception handling for third party exceptions with internal constructors ,像这样:

mock.Setup(x => x.OnEvent(new object(), 
Activator.CreateInstance(typeof(NotificationEventArgs),
BindingFlags.NonPublic | BindingFlags.Instance,
null,
null,
null))
);

关于c# - 如何使用内部构造函数模拟事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5555251/

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