如何使用 Moq 测试 ServiceStack 服务

2024-03-07

我有一个使用 ServiceStack 创建的休息服务,使用 nHibernate 作为从 SqlCe 数据库获取数据的方式。我一直在尝试使用 nUnit 和 Moq 编写一些单元测试 - 我已成功模拟 nHibernate 实现以返回 null、无效对象等 - 但我的测试总是抛出NullReferenceException当它调用基类来设置 HttpStatus 等时。

public List <ParameterDto> Get (ParameterAll parameterAll)
    {
        List <ParameterDto> parameterResponseList = new List <ParameterDto> ();
        try
        {
            List <ParameterDomainObject> parameterDomainObjectList = _ParameterDao.getAllParameters ();
            foreach (ParameterDomainObject parameterDomainObject in parameterDomainObjectList)
            {
                parameterResponseList.Add (parameterDomainObject.ToDto ());
            }
        }
        catch (WebServiceException webEx)
        {
            Debug.WriteLine ("WebServiceException.ErrorCode         " + webEx.ErrorCode);
            Debug.WriteLine ("WebServiceException.ErrorMessage      " + webEx.ErrorMessage);
            Debug.WriteLine ("WebServiceException.ResponseStatus    " + webEx.ResponseStatus);
            Debug.WriteLine ("WebServiceException.StatusCode        " + webEx.StatusCode);
            Debug.WriteLine ("WebServiceException.StatusDescription " + webEx.StatusDescription);
            Debug.WriteLine ("WebServiceException.ErrorCode         " + webEx.ErrorCode);
        }
        catch (DomainObjectNotFoundException domainObjectNotFoundException)
        {
            base.Response.StatusCode = (int) HttpStatusCode.NotFound;
            base.Response.AddHeader ("Reason",
                                     domainObjectNotFoundException.Message);
        }
        catch (Exception exception)
        {
            Debug.WriteLine ("Exception: " + exception.Message);
            base.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
            base.Response.AddHeader ("Reason",
                                     exception.Message);
        }
        /* Always throws an exception here, or anywhere base.Response is called */
        base.Response.StatusCode = (int) HttpStatusCode.OK;
        base.Response.AddHeader ("Reason",
                                 Strings.ParameterRestResponse_Get_OK);
        return parameterResponseList;
    }

当使用 RestClient 和 Firefox 测试该服务时,当我注释掉该服务时,该服务工作正常base.Response代码,所以我猜我只是没有在单元测试中正确设置一些东西?

    [Test]
    public void Test_Method_Get_AllParameters_Unsucessful ()
    {
        Mock <IRequestContext> mockedRequestContext = new Mock<IRequestContext>();
        mockedRequestContext.SetupGet(f => f.AbsoluteUri).Returns("http:/localhost:8080/parameters/all");

        Mock<IParameterDao> mockedParameterDao = new Mock<IParameterDao>();
        mockedParameterDao.Setup (returns => returns.getAllParameters ()).Returns (new List <ParameterDomainObject> ());
        Assert.IsNotNull (mockedParameterDao);

        ParameterRestService service = new ParameterRestService(mockedParameterDao.Object)
        {
            RequestContext = mockedRequestContext.Object
        };

        List <ParameterDto> parameterDtos = service.Get (new ParameterAll ());
    }

看起来您只需要模拟 Service 类的 Response 属性。它受到没有设置器的保护,但你应该能够模拟它做类似的事情......

    Mock<IRequestContext> mockedRequestContext = new Mock<IRequestContext>();
    Mock<IHttpResponse> mockedResponse = new Mock<IHttpResponse>();
    mockedRequestContext.SetupGet(f => f.AbsoluteUri).Returns("http:/localhost:8080/parameters/all");
    mockedRequestContext.Setup(f => f.Get<IHttpResponse>()).Returns(mockedResponse.Object);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Moq 测试 ServiceStack 服务 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • NDK 应用 onDestroy 清理 - 如何 DetachCurrentThread

    因此 如果我们连接 我们必须在完成后分离线程 对吗 JNIEnv get jni env JNIEnv res JAVA VM gt GetEnv void res JNI VERSION 1 6 Using cached JavaVM J
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 如何从外语线程调用Python函数(C++)

    我正在开发一个程序 使用 DirectShow 来抓取音频数据 媒体文件 DirectShow 使用线程将音频数据传递给回调 我的程序中的函数 然后我让该回调函数调用另一个函数 Python 中的函数 我使用 Boost Python 来包
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐