Moq 如何模拟数据以进行模式匹配?
How does Moq mock a data for pattern matching?
背景
public interface IEvent {}
public class Event1 : IEvent {}
public class Event2 : IEvent {}
现在我有一个业务逻辑可以做到这一点:
switch (evt) {
case Event1 e1: {
// do something so I can use e1 directly
}
default: {
// handle other types of concrete events
}
}
在单元测试中,我模拟了一个可观察到的测试来抽取一组具体的事件类型,然后我可以做
testScheduler.AdvanceBy(n)
我可以测试业务逻辑的每个部分。
但是,现在我必须创建每个事件的具体类型并将它们放入可观察对象中。
我确实必须模拟一些数据实体,因为有些依赖于无法模拟的附加类型,这就是为什么我有这个数据对象的接口。一个例子是,我包装了 BrokeredMessage
,这样我就可以从接口调用 CompleteAsync
,而不是实际的不可模拟的 BrokeredMessage
。
如何使用 MOQ 模拟数据对象以便模式匹配起作用?
谢谢
我刚刚遇到了同样的问题,对于我的用例来说,回到老方法而不使用模式匹配没问题。
但是应该可以推出自己的测试替身并通过它们,例如
public class TestEvent1 : Event1 {}
将任何你想覆盖的方法设为虚拟,然后你可以在你的测试代码中伪造它们。
比最小起订量更多的工作,但它允许在不更改 SUT 以匹配测试的情况下测试模式匹配。
背景
public interface IEvent {}
public class Event1 : IEvent {}
public class Event2 : IEvent {}
现在我有一个业务逻辑可以做到这一点:
switch (evt) {
case Event1 e1: {
// do something so I can use e1 directly
}
default: {
// handle other types of concrete events
}
}
在单元测试中,我模拟了一个可观察到的测试来抽取一组具体的事件类型,然后我可以做
testScheduler.AdvanceBy(n)
我可以测试业务逻辑的每个部分。
但是,现在我必须创建每个事件的具体类型并将它们放入可观察对象中。
我确实必须模拟一些数据实体,因为有些依赖于无法模拟的附加类型,这就是为什么我有这个数据对象的接口。一个例子是,我包装了 BrokeredMessage
,这样我就可以从接口调用 CompleteAsync
,而不是实际的不可模拟的 BrokeredMessage
。
如何使用 MOQ 模拟数据对象以便模式匹配起作用?
谢谢
我刚刚遇到了同样的问题,对于我的用例来说,回到老方法而不使用模式匹配没问题。
但是应该可以推出自己的测试替身并通过它们,例如
public class TestEvent1 : Event1 {}
将任何你想覆盖的方法设为虚拟,然后你可以在你的测试代码中伪造它们。
比最小起订量更多的工作,但它允许在不更改 SUT 以匹配测试的情况下测试模式匹配。