【问题标题】:What do I make my mockContext.Setup return in case of a stored procedure?在存储过程的情况下,我该如何让我的 mockContext.Setup 返回?
【发布时间】:2016-03-07 10:07:01
【问题描述】:

我正在为一个函数编写单元测试,该函数又使用实体框架调用存储过程。存储过程返回空值或整数。我试图嘲笑这部分。我尝试了以下

mockContext.Setup(c => c.SP_DoSomething(param1, param2)).Returns(ObjectResult<int?> ???);

我想在我的模拟中返回 0。我怎样才能做到这一点?

【问题讨论】:

    标签: c# entity-framework unit-testing stored-procedures moq


    【解决方案1】:

    ObjectResult&lt;T&gt; 类是一个密封类,没有任何公共 C'tor、初始化/设置方法。

    您可以使用PrivateObject Class 或使用反射,但是这两个选项都不会提供优雅/可读的解决方案。

    优雅/可读的解决方案是使用MsFakes/Typemock Isolator等代码编织工具;在以下示例中,我使用 MsFakes:

    var queryResult = new List<int?>() { 0 };
    
    var fakeQueryResult = new ShimObjectResult<int?>
    {
        GetEnumerator = () => queryResult.GetEnumerator(),
        GetIListSourceListInternal = () => queryResult,
        GetEnumeratorInternal = () => queryResult.GetEnumerator()
    };
    
    mockContext.Setup(c => c.SP_DoSomething(param1, param2)).Returns(fakeQueryResult);
    

    【讨论】:

    • 在返回(fakeQueryResult)时,我得到“无法将类型 'System.Data.Objects.Fakes.ShimObjectResult<...>' 转换为 'System.Data.Entity.Core.Objects.ObjectResult'
    • @user2027080,你没有“伪造”正确的类型。您已经从命名空间 System.Data.Objects 而不是 System.Data.Entity.Core.Objects 生成了一个 shim。
    • 太棒了,现在我修复了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多