指令中的 Angular + 茉莉花 + 模拟 $stateParams

2024-06-19

在指令中模拟 $stateParams 的最佳方法是什么? $stateParam成员会根据测试而改变。

我可以使用 $controller('ctrl', $stateParams) 轻松模拟控制器中的 $stateParams,但不知道如何修改注入指令的 $stateParams。

我已经采用了以下方法来装饰 $stateParams ,但只能在创建模块时声明这一点。正如我提到的,$stateParam 成员将通过不同的测试多次更改。

beforeEach(angular.mock.module(function ($provide) {

    $provide.provider('$stateParams', function () {
        return {
            myStateParam: true,
            myOtherStateParam: 'some text'
        };
    });

}));

使用指令控制器来处理与路由相关的逻辑($state/$route)始终是一个好主意,这是控制器的工作,而不是链接功能的工作。

如果指令可以通过测试其控制器并模拟其本地依赖项来完全测试(归功于 JB Nizet 的回答)故事就这样结束了:

$controller('...', { $scope: scope, $stateParams: { ... });

常规指令规范并非如此$compile. $compile uses $controller在内部实例化控制器,但不接受局部变量来模拟其依赖项。

有几种方法可以处理这个问题。

$provide.factory

If $stateParams不必直接注入到spec中,因此是未实例化的,它的值可以在模块引导后定义。当每个规范只应模拟一次服务实例值时,无需再犹豫:

var stateParams;

beforeEach(module(('...', function ($provide) {
    $provide.factory('$stateParams', function () {
        return stateParams;
    });
}));

it('...', inject(function ($compile) {
  stateParams = { ... };
  ...

$provide.constant

$provide服务提供者可以作为服务实例公开 https://stackoverflow.com/a/33704523/3731501在模块引导后(重新)定义服务:

beforeEach(module('...', function ($provide) {
  $provide.value('$provide', $provide);
}));

it('...', inject(function ($provide, $compile) {
  $provide.constant('$stateParams', { ... });
  ...

$provide.constant在这种情况下更可取,因为它将替换缓存$stateParams服务实例(如果之前已注入),而$provide.value won't.

角度复制

angular.copy(实际上 UI Router 0.x 使用它来保持$stateParamsobject up to date)可用于保留现有对象引用但替换其内容:

it('...', inject(function ($stateParams, $compile) {
  angular.copy({ ... }, $stateParams);
  ...

$state.params

$state服务还鲜为人知公开暴露给API http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.%24state#properties_params财产params,它可以用来替代$stateParams为整个代码提供服务以提高其可测试性。

$stateParams and $state.params可能不指同一个对象,因此必须选择其中之一。

以因未经请求而导致测试脆弱的风险为代价$state注入,它可以像

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

指令中的 Angular + 茉莉花 + 模拟 $stateParams 的相关文章

  • 使用箭头键盘而不是鼠标时,ng-options 模型未更新

    我创建了js小提琴 Fiddle http jsfiddle net reptildarat Z4AN2 3 我创建了一个包含一些 ng options 的表单 当您使用按钮而不是鼠标时 它会出现奇怪的行为 只需单击文本框并按 tab 您可
  • 使用 AngularJS“copy()”避免引用问题

    我正在显示一个项目列表 每个项目旁边都有一个 编辑 按钮 单击可打开 Angular ui 模式窗口 用户可以更改特定项目的某些属性 现在 让我烦恼的是 当在此编辑窗口中输入内容时 项目列表中的特定项目立即反映了更改 我只希望它在用户单击模
  • 奇怪的 Angular-ChartJS 问题,在 Ionic App 中无法正确显示

    我正在使用 AngularJS 构建一个 Ionic 应用程序 在此应用程序中 我想要一个数据折线图 昨天我问了一个关于这个的问题 Angular Chart 不渲染任何内容 https stackoverflow com question
  • 单元测试 SqlFunction

    我有一个公开 IQueryable 的存储库和一个处理特定查询的服务 这里有一些使用 DbFunctions 的方法 为了可测试 我创建了一个带有静态元素列表的假存储库并将其注入到服务中 问题是 由于我的服务查询列表并且不使用数据库 因此我
  • Angular 中的动态标签生成

    我正在尝试使用包含一堆指令名称的数组动态生成表单 scope components textbox textbox radio checkbox label 我想使用 Angular 生成具有这些名称的标签 例如
  • AngularJS 控制器内的函数

    我有一个代码片段 其中有一个 Angular 模块化控制器 但同一控制器内有一个函数并带有一个调用 这让我怀疑 Javascript 或 Angular 是否允许这种编码方式 如果是 那么它如何读取它 请参阅我的以下代码格式 obj con
  • 打字稿中带有谷歌标记的自定义属性

    我正在使用类型脚本 并在尝试使用 Google 标记设置自定义属性时出现以下错误 谁能建议如何使用 Google 地图标记设置自定义属性 类型参数 position LatLng 地图 任何 图标 字符串 zIndex 数字 se10 任何
  • 使用 angularjs 进行动态 url 路由

    我的代码中有类似的东西 ul p b item name b p 例如 我有 3 件商品 宝马 高尔夫和梅赛德斯 我想要一个包含每个项目名称的 url 例如 bmw 或 mercedes 并且所有 url 使用details html 来显
  • 创建 IEqualityComparer>

    我正在使用 xUnit 它没有办法确定 2 是否IEnumerable
  • VS 2010 和 MBUnit 如何只运行一项测试

    我安装了 Gallio MbUnit 并使用 VS 2010 RC 我希望能够运行单个单元测试或 TestFixture 内的所有单元测试 而不是每次调试时整个项目中的所有测试 在 VS 2010 中如何做到这一点 安装testdriven
  • 如果不在异步测试执行区域内,fixture.whenStable() 实际上会在我的角度测试中执行任何操作吗?

    我最近读了很多关于角度测试的文章 这些对总是 async fixture whenStable 和 fakeAsync tick 但是您始终可以调用 fixtrue whenStable 因为它不是紧密耦合的 如果您在不使用异步实用程序来跟
  • 如何在控制器中模拟 Automapper (IMapper)

    我正在尝试为现有的 MVC Web 应用程序编写单元测试 我在自动映射器中面临一些问题 IMapper 每当使用地图函数时它都会返回null value 我的控制器代码 public class UserAdministrationCont
  • 如何配置 Teamcity 以忽略某些测试

    有没有办法配置 Teamcity 忽略某些测试 我只需要在本地运行这些测试 当它们在 Teamcity 中运行时 必须被忽略 我正在使用 nunit 这可以是指令 属性等 您可以通过向测试中添加测试类别来做到这一点 Category Loc
  • 不使用 data-* 前缀的自定义 HTML 属性是否有效? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 jQuery 的 Promise 有 did(),而 Mozilla 记录的 Javascript 的 Promise 却没有?如果我想在 JS 中有一个 did() 该怎么办?

    Mozilla 的 JavaScript 文档的 Promise 之间有什么区别 请参阅API page https developer mozilla org en US docs Web JavaScript Reference Glo
  • 如何在 Amserial 图表中添加图例

    我在 AngularJS 应用程序中使用 Amcharts 创建一个简单的条形图 以下是我在控制器中的代码 let empChart let empBarGraph let empLine const writeemp data gt co
  • 如何测试两个 Joda-Time DateTime 对象几乎相等?

    在单元测试中 我经常使用返回DateTime于或关于now 有没有办法说actual日期时间在几秒之内actual约会时间 这听起来是个坏主意 单元测试不应该以任何方式依赖于当前的实际时间 这就是为什么注入一些接口是一个很好的做法 称为Cl
  • 将输入包装在角度指令中

    我的想法是将输入包装到自定义指令中 以保证整个网站的外观和行为一致 我还想包装 bootstrap ui 的日期选择器和下拉菜单 此外 该指令应该处理验证并显示工具提示 HTML 应该看起来像这样
  • 预期在模拟中调用一次,但使用 Moq 时调用次数为 0 次

    我收到错误 在mock上调用一次 但是0次 下面是我的代码结构 public class GenerateAddress IGenerateAddress public GenerateAddress IAddress createAdd
  • AngularJS:如何通过 websocket 发送文件?

    我是 websocket 的新手 我被分配了一个现有的工作聊天模块 目前该模块仅向其他用户发送消息 我被要求集成用户可以互相发送 附件 的功能 供参考 我发现了这个链接 https stackoverflow com questions 1

随机推荐