为什么我想要模拟的属性需要是虚拟的?

2024-01-02

我正在做一些单元测试,并使用模拟一些属性Moq.

现在,这是一个控制器测试(ASP.NET MVC 3)。我的控制器源自abstract控制器,称为抽象控制器.

该控制器依赖于 Http Context(以便执行诸如主题、基于 HTTP HOST 标头的特定于域的逻辑等操作)。

这是通过一个名为的属性完成的网站设置:

public abstract class AbstractController : Controller
{
   public WebSiteSettings WebSiteSettings { get; private set; }

   // other code
}

注意私有集 - 构造者设置它。所以,我将其更改为使用接口,这就是我所嘲笑的:

public IWebSiteSettings WebSiteSettings { get; private set; }

然后我创建了一个“FakeWebSiteSettings”,它模拟 Http 上下文,以便它读取 HTTP 标头。

问题是,当我运行测试时,我得到一个不支持异常:

非虚拟(在 VB 中可重写)成员上的设置无效:x => x.WebSiteSettings

这是相关的模拟代码:

var mockWebSiteSettings = new Mock<FakeWebSiteSettings>();
var mockController = new Mock<MyController>(SomeRepository);
mockController.Setup(x => x.WebSiteSettings).Returns(mockWebSiteSettings.Object);

_controller = mockController.Object;

var httpContextBase = MvcMockHelpers.FakeHttpContext();
httpContextBase.Setup(x => x.Request.ServerVariables).Returns(new NameValueCollection
    {
        {"HTTP_HOST","localhost.www.mydomain.com"}, 
});
_controller.SetFakeControllerContext(httpContextBase.Object);

如果我做WebsiteSettings财产virtual- 测试通过。

但我不明白为什么我需要这样做。我其实不是压倒性的该属性,我只是嘲笑它的设置方式。

我错过了什么,或者做错了什么?


Moq 和其他类似的模拟框架只能模拟接口、抽象方法/属性(在抽象类上)或具体类上的虚拟方法/属性。

这是因为它生成一个代理,该代理将实现该接口或创建一个派生类来重写这些可重写方法以拦截调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我想要模拟的属性需要是虚拟的? 的相关文章

  • 如何使用 Git 子模块和 CMake 处理传递依赖冲突?

    我们有许多 Git 存储库 有些包含我们自己的代码 有些包含稍作修改的第三方库代码 简化的依赖图如下所示 executable A v library B v v library C 所以可执行文件有两个依赖项library C 一种是直接
  • 将 Blend 行为添加到 DatePicker 时出现问题

    我正在尝试向 DatePicker 控件添加 Blend 行为 以将 MVVM Light RelayCommand 绑定到 DateChanged 事件 如下所示
  • 指定初始化和基类?

    在C 20 最新草案 中 给出以下代码 struct B int mb struct D B int md 这六个表达式中哪些是格式错误的 哪些不是 1 D 42 43 2 D 42 43 3 D 42 md 43 4 D 42 md 43
  • dll 的 App.config

    我们有一个 引擎 可以动态加载 dll 无论位于某个目录中的什么 并通过反射的方式从中调用工作流类 我们现在有一些需要访问数据库的新工作流程 因此我想将配置文件放在 dll 目录中 但由于某种原因 我的工作流程看不到配置文件
  • xamarin.forms 从 xaml 到属性的绑定

    我是一个 xaml 绑定的新手 有时我真的不明白 我的 xaml 中有这个
  • 为什么 XRecordDisableContext() 不起作用?

    void Callback XPointer XRecordInterceptData pRecord std cout lt lt my logs n int main if auto const pDisplay XOpenDispla
  • 将 IRandomAccessStreamWithContentType 转换为 Byte[]

    在我的应用程序中 我允许用户使用 ContactPicker 添加联系人 我尝试将 IRandomAccessStreamWithContentType 转换为 Byte IRandomAccessStreamWithContentType
  • Cython memoryviews:使用数组参数包装 c 函数以传递 numpy 数组

    我正在尝试使用 Cython 用数组参数包装 c 函数 quick sort 所以我可以将 numpy 数组传递给它 我已经在文档 SO 和网络中搜索了一个可行的 最小的示例 但没有找到它 我已经尝试了几种可能性 但没有任何进展 所以请帮我
  • ASP.NET Identity Extend 方法来访问用户属性

    我可以扩展方法来访问用户属性吗 有这样的方法 User Identity GetUserId User Identity GetUserName 可以从视图和控制器访问它们 我想使用以下方法扩展此功能 User Identity GetUs
  • 游戏网络射弹实施/概念问题[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在尝试找到某种解决方案来解决同步射弹射击和游戏网络的常见问题 但我不确定什么是最合适的 这是一款 2D 动作横向卷轴游戏 带有多个射弹 没有即时攻
  • 为什么 std::move() 没有窃取 int 值? [复制]

    这个问题在这里已经有答案了 std move 正在窃取字符串值 而不是 int 请帮助我 int main int i 50 string str Mahesh int j std move i string name std move s
  • 类库的 app.config 中的绑定重定向有什么作用吗?

    我经常使用的 VS 解决方案包括单个可执行项目 控制台应用程序 网络应用程序 和许多类库项目这些都被可执行文件引用 使用 NuGet 并安装包时 经常会出现app config为每个项目创建的文件 通常只包含合并引用程序集版本的绑定重定向列
  • 在存储库模式中按 ID 进行过滤是否是不好的做法

    我正在使用 ASP NETMVC4 with 实体框架5 基本上每个控制器操作结果按登录用户的公司 ID 过滤数据库结果 我刚刚开始实现存储库模式来返回模型 而不是直接从控制器过滤 DbContext 将companyID传递到存储库中以过
  • 虚拟调用与类型检查的另一个例子

    Problem 我发誓 每次我脑子里都在想 我应该使用虚拟调用而不是类型检查 例如 if obj is Foo else if obj is Bar 我想出了另一个例子 我不知道如何实现前者 我正在通过串行端口实现分组协议 一些伪代码可以最
  • 以十六进制打印字符串? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这种以十六进制打印字符串的简短方法是
  • 如何取消异步下载?

    我有一个问题 如何取消下载 client CancelAsync 对我来说不起作用 因为如果我取消下载并开始新的下载 代码仍会尝试访问旧的下载文件 您必须知道 在我的代码中 有一个部分 当下载完成时 它应该解压缩已下载的文件 像这样的示例
  • 如何在 OleDB 中将表名作为参数传递?

    private void button1 Click object sender EventArgs e string tablename label2 Text string name TextBox1 Text DBconnection
  • 是否可以模拟 Python 3.6 中的内置 len() 函数?

    是否可以模拟内置len Python 3 6 中的函数 我有一个类定义了一个简单的方法 该方法依赖于len 函数如下 class MyLenFunc object def is longer than three characters se
  • 为什么“扔”和“扔前”在这种情况下有相同的行为?

    我惊呆了 我一直以为throw单独在 catch 块中会抛出手头的异常而不改变堆栈跟踪 但是throw ex在 catch 块中将更改堆栈跟踪以显示源自语句位置的异常 采取以下两个代码块 我希望输出会略有不同 因为使用throw和其他用途t
  • 泛型和实现 IComparable

    我对泛型非常陌生 我正在尝试编写一个简单的类 它将是泛型的 但也允许对字符串成员变量的一些描述进行排序 目前我有一个基本类 但是当我尝试实现接口成员 CompareTo 时 我在顶部收到一个错误 告诉我它尚未实现 这里有什么问题呢 usin

随机推荐