小编Łuk*_*man的帖子

如何在AngularJs中使用私有方法编写可测试的控制器?

好吧,所以我长期以来一直在绊倒一些问题,我想听听社区其他人的意见.

首先,让我们看一些抽象的控制器.

function Ctrl($scope, anyService) {

   $scope.field = "field";
   $scope.whenClicked = function() {
      util();
   };

   function util() {
      anyService.doSmth();
   }

}
Run Code Online (Sandbox Code Playgroud)

显然我们在这里:

  • 用于控制器的常规脚手架$scope和注入的一些服务
  • 一些字段和功能附加到范围
  • 私人方法 util()

现在,我想在单元测试(Jasmine)中介绍这个课程.但是,问题是我想验证当我单击(调用whenClicked())某个项时util()将调用该方法.我不知道该怎么做,因为在Jasmine测试中我总是得到错误,无论是模拟util()还是没有被调用.

注意:我不是要修复这个特定的例子,我一般都在询问测试这样的代码模式.所以请不要告诉我"究竟是什么错误".我问的是如何做到这一点,而不是如何解决这个问题.

我一直在尝试各种方法:

  • 显然我不能$scope在我的单元测试中使用,因为我没有附加到此对象的此功能(它通常以消息Expected spy but got undefined或类似结尾)
  • 我尝试将这些函数附加到控制器对象Ctrl.util = util;,然后验证模拟,Ctrl.util = jasmine.createSpy()但在这种情况下Ctrl.util没有被调用,因此测试失败
  • 我试图改变util()以附加到this对象并Ctrl.util再次嘲笑,没有运气

好吧,我无法找到解决这个问题的方法,我期待JS忍者的一些帮助,一个工作小提琴将是完美的.

testing tdd angularjs

57
推荐指数
3
解决办法
3万
查看次数

告诉AngularJs通过依赖注入返回一个新实例

用例很简单:我有两个控制器共享相同的依赖项MyService.这项服务是持有一些状态,让我们坐下来myVariable.如果我设置它ControllerOne,那么它也会被发现ControllerTwo.

我想要的是每个控制器拥有它自己的实例MyService,因此myVariable可以由每个控制器更改而不影响另一个.

换句话说 - 我希望通过依赖注入返回新实例,而不是单例.

javascript angularjs

21
推荐指数
1
解决办法
1万
查看次数

使用自定义HTML包装指令(另一个指令)

假设我有工作指令叫<my-directive>.它做了一些HTML渲染和事件处理,它经过了彻底的测试.

现在我想用另一个包装器指令包装这个指令,该指令<wrapper>将呈现这个html片段<div class="my-div">,这样我就可以编写如下代码:

<wrapper>
   <my-directive></my-directive>
</wrapper>
Run Code Online (Sandbox Code Playgroud)

并有:

<div class="my-div">
   <my-directive></my-directive>
</div>
Run Code Online (Sandbox Code Playgroud)

怎么能实现呢?我以前尝试过一些方法,它们似乎都没有工作,所以我没有发布任何代码.

angularjs angularjs-directive

21
推荐指数
2
解决办法
1万
查看次数

Weka中FP-Growth的数据要求是什么?

我想在Weka的数据集(模型)中使用FP-Growth关联规则算法.

不幸的是,这个算法是灰色的.我必须满足哪些先决条件才能使用它?

java data-mining weka

14
推荐指数
1
解决办法
6882
查看次数

AngularJs中两个模块之间的通信

这很容易想象,但我没有找到任何资源提到这个问题的正确方法.

我想在一个角度模块中广播事件并在另一个角度模块中接收它.这两个模块完全不同,具有不同的代码库和目的.他们唯一的共同点是他们在同一个域的网站上运行(由于相同的原始策略可能很重要).

我知道这是可能的,例如通过HTML5的本地存储同步事件.我只是想知道如何正确地做到这一点.

javascript angularjs

14
推荐指数
2
解决办法
8440
查看次数

我应该重用一个GSON实例还是按需创建新实例?

在我的大多数类(特别是服务器资源)中,我倾向于创建com.google.gson.Gson按需的新实例.有时我使用默认构造函数创建它们(用于处理简单的POJO),有时我会使用使用自定义创建的更复杂的变体com.google.gson.GsonBuilder.

我知道这Gson是一个线程安全的类,所以没有什么可以反对重用相同的实例Gson而不是创建新的实例.哎呀,我甚至可以为此重复使用静态常量!

我的问题是:我应该在需要时创建新实例,还是应该只创建一个实例?如果我使用Gson创建的实例序列化简单的POJO GsonBuilder并教会如何解析更复杂的数据结构(几乎没有注册自定义序列化程序),那么我将面临什么样的性能影响?

java json gson

13
推荐指数
1
解决办法
2179
查看次数

如何确保来自JMS队列的消息传递到外部WebService(CXF)?

这个问题

如何配置ActiveMQ<flow>进入Mule ESB 3.2,以确保从队列中提取的消息最终由外部正确处理CXF service

脚本

我有一个CXF端点,它应该接收传入消息并尽快将其传输到三个外部服务.我们称它们为EX1,EX2,EX3.由于<all>Mule 3.x中引入了组件,这非常简单.

整个解决方案最重要的要求是确保每个收到的消息最终都交付给所有三个CXF服务.所以我们最终得出了这个想法,将每个传入的消息放入Persistent JMS queues(Q1,Q2,Q3).在从队列Qn读取消息之后,它直接转移到相应的EXn端点,因此 - 外部服务.

配置

(我可以根据要求提供完整的配置)

我们已经按照此处的描述配置了ActiveMQ代理,并将其与我们的<flow>配置连接起来.一切似乎按预期工作,我有JConsole连接到我的应用程序,所以我可以看到消息是PERSISTENT类型,他们最终排队等候.如果一切顺利 - 所有三个服务EXn都会收到消息.

测试

当我们关闭其中一个服务时,问题就出现了,让我们说EX2,并重新启动整个服务器模拟失败.消息最终会丢失(我想这不是那么持久,是吧?).最奇怪的是 - 如果我们在EX2关闭时发送了10条消息,那么在服务器重启后,其中9条正在被重新传送!所以我想也许,也许,这10条消息中有9条已经正确入队,而当服务器发生故障时,这条消息中的9条经常被重新传送.

这让我觉得,CXF端点没有处理事务支持,说实话我无法理解.毕竟,当我尝试重新传递时,我可以看到消息在队列中,所以它应该被保留.这显然不是,但为什么呢?

我自己的尝试 我已经尝试过很多东西,但都没有.总是有一条消息丢失.

  1. 不要<jms:transaction />在流程中使用任何标签 - 不起作用
  2. 在收到消息时启动jms事务,在发送时加入 <cxf:jaxws-client />
  3. 将XA与JBoss一起使用<xa-transaction />- 并没有用
  4. 提供<default-exception-strategy>配置 - 如果我记得它让事情变得更糟

任何帮助表示赞赏,谢谢.

CONFIG

ACTIVE MQ CONFIGURATION

<spring:bean id="AmqDefaultPolicyEntry" class="org.apache.activemq.broker.region.policy.PolicyEntry">
    <spring:property name="queue" value="queue.*"/>
    <spring:property name="deadLetterStrategy" ref="AmqDeadLetterStrategy"/>
</spring:bean>

<spring:bean …
Run Code Online (Sandbox Code Playgroud)

java activemq-classic jms cxf mule

8
推荐指数
1
解决办法
1万
查看次数

如果父级具有相对高度,如何在子div上强制滚动条?

我试图解决的问题很简单,但我发现很难用CSS技术实现我想要的东西.

我想要的是将某种div高度设置为相对值的父级(例如:100%或30%).请不要问为什么我需要它,因为这只是一个部分和解释整个布局超出了这个问题.

在这个父级内部,我需要有一个标题,h1后跟div包含大量文本的子标题.最重要的是,我需要在子div内部设置滚动条,以便标题始终保持连接到容器的顶部.

标记:

<div class="wrapper">
    <h1>Test</h1>
    <div class="text">
        Lorem ipsum (... lots of text)
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

(不)工作小提琴:http: //jsfiddle.net/CodeConstructors/BEVSS/

html css scroll

8
推荐指数
1
解决办法
5004
查看次数

我应该始终将函数绑定到$ scope对象吗?

当我创建控制器时,我总是向$scope对象添加函数,如下所示:

function DummyController($scope) {

  $scope.importantFunction = function () { /*...*/ };

  $scope.lessImportantFunction = function () { /*...*/ };

  $scope.bussinessLogicFunction = function () { /*...*/ };

  $scope.utilityFunction = function () { /*...*/ };

}
Run Code Online (Sandbox Code Playgroud)

当然,我保持我的控制器封装良好,确保业务逻辑位于适当的组件(通过DI注入)或服务.因此,控制器专注于在UI和后端之间编排事物.

但是,正如您所看到的 - 仍有许多不同类型的功能.我喜欢保留更多,因为它提高了可读性恕我直言.

问题 这是一个很好的做法,有很多函数附加到$ scope对象?它有性能开销吗?我知道这$scope是一种特殊的对象,在Angular的摘要周期中经常被评估,所以我这样做是正确还是我会坚持我的方法来惹麻烦?

(请注意:我不是在寻找替代方法.我正在寻找一些对Angular内部人员进行深思熟虑的分析.)

谢谢!

更新:

安德斯的答案非常好,并向您展示了一些可以遵循的道路.今天我遇到了这个美容,一个用于Angular Js调试和性能监控chrome扩展.它显示了所有范围和分配的变量,以及一些有趣的性能图.任何Angular开发者都必须拥有!

javascript angularjs

7
推荐指数
1
解决办法
2043
查看次数

我还应该把所有的css保存在一个文件中吗?

曾几何时,我被更高级的Web开发人员认为(哎呀,什么时候再次?;))我们应该避免管理多个CSS文件并坚持每个项目一个.在处理大量重叠的CSS规则时,它有助于提高页面加载速度并避免愚蠢的错误.

我的问题是 - 这种方法仍然有效吗?

关于页面加载性能的争论现在似乎并没有那么多,因为令人敬畏的宽带互联网和巧妙的网络浏览器具有更强大的缓存功能.CSS级联确实容易出错,但仅适用于没有经验的开发人员,并且有一个CSS样式表并不能真正让我们防弹.

我认为我更喜欢将一组默认样式表整齐地分隔成组件,然后通过CSS将它们连接成一个单独的规则@import.这也允许我默认包含重置样式表.

有谁和我在一起?

css optimization

6
推荐指数
1
解决办法
240
查看次数