gpt4 book ai didi

c# - EF6 - 无法模拟 ObjectResult 的返回值以进行单元测试

转载 作者:太空狗 更新时间:2023-10-30 00:24:00 25 4
gpt4 key购买 nike

我在尝试单元测试的方法中有与此类似的代码:

return _context.usp_get_Some_Data(someStringParam).FirstOrDefault();

存储过程调用返回类型:

ObjectResult<usp_get_Some_Data_Result>. 

在我的单元测试中,我试图做这样的事情(使用 NUnit 和 Moq):

var procResult = new ObjectResult<usp_get_Some_Data_Result>();
mockContext.Setup(m => m.usp_get_Some_Data(It.IsAny<string>()))
.Returns(procResult);

但是,我无法创建 ObjectResult 的实例(这是 System.Data.Entity.Core.Objects.ObjectResult ,而不是旧的 System.Data.Objects 实例)。它没有公共(public)无参数构造函数,但是 documentation说它有一个 protected 。根据我的测试,他的文档似乎不正确。

我尝试过的:我试过创建一个派生类并在构造函数上调用 base(),我也试过使用反射(Activator.CreateInstance 和使用 NonPublic 的 BindingFlags 调用 ConstructorInfo,所有这些都失败了(它出现在我的调试中这就是该类型确实具有三个私有(private)构造函数,所有这些构造函数都有 3 个或更多参数,但不幸的是,弄清楚这些参数实际需要什么似乎是一项重大努力。

我还尝试创建一个 IEnumberable 并将其转换为 ObjectResult 但转换失败。另外,我试过类似的方法

var mockObjectResult = new Mock<ObjectResult<usp_get_Some_Data_Result>>();

几乎所有我尝试过的事情都失败了,并出现了关于默认构造函数不可用的类似错误。

问题:有什么方法可以创建用于单元测试的 ObjectResult 实例,或者我可以创建可以成功转换为 ObjectResult 的任何其他类型吗?

最佳答案

也许我遗漏了什么,但你不能这样做吗:

class TestableObjectResult<T> : ObjectResult<T>
{
}

然后在你的测试中:

var mockObjectResult = new Mock<TestableObjectResult<usp_get_Some_Data_Result>>();

MockObject 确实有一个 protected 构造函数,你真的不需要做任何事情来调用它,因为它没有任何参数,当你构造可测试版本时 Autowiring 会处理它,所以我我不确定你所说的“在构造函数上调用 base()”是什么意思......

如果我右键单击 ObjectResult 并选择 goto definition,文件的顶部如下所示:

public class ObjectResult<T> : ObjectResult, IEnumerable<T>, IEnumerable, IDbAsyncEnumerable<T>, IDbAsyncEnumerable
{
// Summary:
// This constructor is intended only for use when creating test doubles that
// will override members with mocked or faked behavior. Use of this constructor
// for other purposes may result in unexpected behavior including but not limited
// to throwing System.NullReferenceException.
protected ObjectResult();

关于c# - EF6 - 无法模拟 ObjectResult<T> 的返回值以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079558/

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