gpt4 book ai didi

c# - 用于生成在另一个具有随机数据的程序集中具有内联构造函数的类的库?

转载 作者:行者123 更新时间:2023-11-30 22:29:40 26 4
gpt4 key购买 nike

我正在从触发事件处理程序的网络服务接收事件通知,其中包含有关触发事件的数据。我正在尝试测试一旦事件处理程序被调用,abc 都被调用了正确的值。如果不依赖网络服务,这是不可能的

我的解决方案是创建转换器,将通过服务库 (Exchange Web Services) 返回给我的 EventArgs 转换为我的愚蠢对象可以理解的东西 而无需 依赖关于第三方服务。我的问题是 EWS 库提供给我的 EventArgs 类有一个内部构造函数,因此没有简单的方法来生成它的具有随机属性值的实例,而不需要太多的反射工作。

例如,我有一个简单的界面:

public interface IConverter<TFrom, TTo>
{
TTo Convert(TFrom from);
}

和一个简单的实现:

public class NotificationEventArgsConverter : IConverter<NotificationEventArgs, NewNotification>
{
public NewNotification Convert(NotificationEventArgs from)
{
return new NewNotification
{
ItemIds = from.Events.Cast<ItemEvent>().Select(x => x.ItemId.ToString())
};
}
}

问题是如何生成具有随机值的 NotificationEventArgs 实例。是否有我在搜索中遗漏的图书馆?

整个目标是模拟如果我收到一个具有以下值的 NotificationEventArgs 实例,那么 NewNotification 应该类似于 x

编辑

在此期间,我将简单地使用 typeof(T).GetConstructor()

最佳答案

您可能想看看 AutoFixture :

AutoFixture makes it easier for developers to do Test-Driven Development by automating non-relevant Test Fixture Setup, allowing the Test Developer to focus on the essentials of each test case.

在对 Microsoft.Exchange.WebServices 进行一些反编译并使用反射进行一些操作之后,您可以像这样进行操作:

var fixture = new Fixture();

// retrieve internal FolderEvent(EventType, DateTime) ctor
// using FolderEvent class as NotificationEvent is abstract
var notificationEventCtor = typeof(FolderEvent).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[] { typeof(EventType), typeof(DateTime) },
null
);

// generate 10 random events with some help of LINQ and AutoFixture
var trashData = Enumerable
.Range(1, 10)
.Select(i => new object[]
{
fixture.CreateAnonymous<EventType>(),
fixture.CreateAnonymous<DateTime>()
})
.Select(p => notificationEventCtor.Invoke(p))
.Cast<NotificationEvent>()
.ToList();

上面的代码将在一个列表中生成 10 个 FolderEvents,准备传递给 NotificationEventArgs 构造函数(它又是内部的,因此适用相同的代码):

var notificationEventArgsCtor = typeof(NotificationEventArgs).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[]
{
typeof(StreamingSubscription),
typeof(IEnumerable<NotificationEvent>)
},
null
);

var instance = notificationEventArgsCtor
.Invoke(new object[] { null, trashData });

关于c# - 用于生成在另一个具有随机数据的程序集中具有内联构造函数的类的库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10090175/

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