我有一个简单的测试套件,it
里面有一个功能.我想看看在我调用的函数中是否调用了某个函数,所以我有这样的东西:
describe("doStuff", function () {
var foo = new Foo();
spyOn(foo, "doOtherStuff");
foo.doStuff(true);
it("should do stuff and other stuff", function() {
expect(foo.stuffDone).toBe(true);
expect(foo.doOtherStuff).toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
但是,这给了我错误: Expected a spy, but got Function.
环顾四周之后,我看到所有的例子都有spyOn
了beforeEach
.所以,我把测试改为:
describe("doStuff", function () {
var foo = new Foo();
beforeEach(function() {
spyOn(foo, "doOtherStuff");
foo.doStuff(true);
});
it("should do stuff and other stuff", function() {
expect(foo.stuffDone).toBe(true);
expect(foo.doOtherStuff).toHaveBeenCalled();
});
});
Run Code Online (Sandbox Code Playgroud)
这很有效.我是很新,茉莉,所以我可能只是缺少明显的东西,但我只是想知道为什么它必须是在beforeEach
为spyOn
工作.只使用它很容易beforeEach
,但我想更好地了解正在发生的事情.谢谢.
我已经搜索了很长一段时间,但所有结果都指向了Java 7之前的NIO解决方案.我已经使用NIO的东西从文件系统的特定位置读取文件,它比之前(Files.readAllBytes(path)
)更容易.现在,我想读取一个打包在WAR和类路径中的文件.我们目前使用类似于以下的代码执行此操作:
Input inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
/* iterate through the input stream to get all the bytes (no way to reliably find the size of the
* file behind the inputStream (see http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()))
*/
int byteInt = -1;
try
{
byteInt = inputStream.read();
while (byteInt != -1)
{
byteStream.write(byteInt);
byteInt = inputStream.read();
}
byteArray = byteStream.toByteArray();
inputStream.close();
return byteArray;
}
catch (IOException e)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
虽然这很有效,但我希望有一个更容易/更好的方法来使用Java 7中的NIO.我猜我需要在类路径上获得一个表示此路径的Path对象,但我是不知道该怎么做.
如果这是一件非常容易的事,我道歉.我只是想不出来.谢谢您的帮助.
我有一个像这样注册的控制器:
myModule.controller('MyController', function ($scope, ...some dependencies...)
{
....
Run Code Online (Sandbox Code Playgroud)
ng-controller="MyController"
在HTML中使用它一切正常,但现在我想使用这个控制器作为我的指令的控制器.有点像这样:
otherModule.directive('myDirective', function() {
return {
restrict: 'A',
replace: true,
controller: ??????????,
scope: {
foo: '=',
blah: '=',
},
template: '....'
}
});
Run Code Online (Sandbox Code Playgroud)
我累了只是把MyController
它错误地说"MyController没有定义".我敢肯定,如果我只是放入MyController
全局命名空间,它会工作正常,但我不想在全局命名空间中有任何东西.如果它有所不同,myModule
则定义为依赖项otherModule
.我怎样才能获得对该控制器的引用以供我的指令使用?
正如所建议的那样,我试过$controller('MyController')
,但现在我收到以下错误:
Error: Unknown provider: $scopeProvider <- $scope <- myDirectiveDirective
at Error (<anonymous>)
at http://localhost/resources/angular.js?_=1360613988651:2627:15
at Object.getService [as get] (http://localhost/resources/angular.js?_=1360613988651:2755:39)
at http://localhost/resources/angular.js?_=1360613988651:2632:45
at getService (http://localhost/resources/angular.js?_=1360613988651:2755:39)
at invoke (http://localhost/resources/angular.js?_=1360613988651:2773:13)
at Object.instantiate (http://localhost/resources/angular.js?_=1360613988651:2805:23)
at http://localhost/resources/angular.js?_=1360613988651:4621:24
at otherModule.directive.restrict (http://localhost/resources/app.js?_=1360613988824:862:15)
at Object.invoke …
Run Code Online (Sandbox Code Playgroud) 这基本上是一个跟进问题这个问题:AngularJS - 如何使用$ routeParams生成templateUrl?.请查看我的代码,了解此问题的正确背景.
所有导航部分都运行良好,但现在当我导航时,我想$scope
基于primaryNav
和更新我的一些属性secondaryNav
.我以为我可以做些什么,$watch
但我似乎无法得到任何工作.以下是我尝试过的一些事情:
$scope.$watch($location.path(), function() {...}); //result in js error
$scope.$watch($location, function() {...}); //function runs once on page load, but not after that
$scope.$watch($window.location, function() {...}); //function runs once on page load, but not after that
$scope.$watch(window.location, function() {...}); //function runs once on page load, but not after that
$scope.$watch(window.location.href, function() {...}); //results in js error
Run Code Online (Sandbox Code Playgroud)
我可以在我的控制器中创建一些方法来获取这些导航并更新所有内容并导航,然后只添加一个ng-click
到所有锚标签.然而,我真正喜欢AngularJS的一件事是为hrefs使用真实的URL值(例如<a href="#/priNav/secNav">Foo</a>
).当我在没有经过控制器上的某些方法的情况下路由时,是否无法根据更改的URL更新我的模型?我希望我的要求是有道理的.
我找到了以下主题:JdbcTemplate与TransactionManager如何一起工作?
第一句话:
据我所知,DataSourceTransactionManager将JDBC连接从指定的DataSource绑定到当前线程,允许每个DataSource一个线程绑定连接.如果它是一个连接池,它将采用一个可用的连接.
......正是我想知道的.
使用事务管理器时,您最终是否拥有自己的单个连接的每个线程?此外,该连接存在多长时间?同一个线程是否在单个请求中使用相同的连接,或者还有其他事情在进行?我只是想了解一下当你有一个事务管理器时Spring正在做什么,而当你没有事务管理器时(无论你是否真的有一个事务).
我正在开发一个可以上传文件的应用.我想创建一个可重用的文件上传组件,该组件可以包含在需要文件上载功能的任何页面上.我原本以为我可以使用JSP标签.但是,我们最近发现了AngularJS,现在想在整个应用程序中使用它.所以,我想创建一个指令,允许我简单地将<myApp-upload>
标记放在我的上传功能中.
我首先将我的上传功能设置为自己的HTML页面,以确保AngularJS与Plupload插件完美搭配.我把这样的东西放在一起:
<html ng-app="myApp">
<head>
<script src="resources/scripts/angular-1.0.1.min.js"></script>
<script src="resources/scripts/myApp.js"></script>
</head>
<body>
<style type="text/css">@import url(resources/scripts/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css);</style>
<script type="text/javascript" src="resources/scripts/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="resources/scripts/plupload/plupload.full.js"></script>
<script type="text/javascript" src="resources/scripts/plupload/jquery.plupload.queue/jquery.plupload.queue.js"></script>
<div id="uploadContainer" ng-controller="FileUploadCtrl">
<div id="dropArea" style="border: 1px black dashed;">Drag files to here<br><br><br></div>
Files to upload:<br>
<div ng-repeat="currFile in uploader.files">{{currFile.name}} ({{currFile.size}})</div>
<br><br>
<!-- For debugging -->
{{uploader.files}}
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
myApp.js看起来像这样:
function FileUploadCtrl($scope)
{
$scope.uploader = new plupload.Uploader({
runtimes : 'html5,flash,html4',
url : 'media/upload',
max_file_size : '10mb',
container: 'uploadContainer',
drop_element: 'dropArea'
});
$scope.uploader.init();
$scope.uploader.bind('FilesAdded', …
Run Code Online (Sandbox Code Playgroud) 这是一个类似的问题这一个.我仍然在我的指令中看到异步数据的一些问题.基本上我有指令,我想将数据传入,并且这些数据是异步获取的.我开始使用指令的scope属性执行此操作,如下所示:
scope: {
myAsyncData: '='
}
Run Code Online (Sandbox Code Playgroud)
在链接函数中我添加了一个,$watch
所以我可以根据范围内的值更新我的模型.像这样的东西:
scope.$watch(scope.foo, function() {
//logic based on myAsyncData
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我开始收到javascript错误,因为异步数据尚未返回.这就是促使我发布上面链接的问题的原因.所以,我然后把我改成了$watch
这样的东西:
scope.$watch(scope.foo, function() {
if (angular.isDefined(scope.myAsyncData))
{
//logic based on myAsyncData
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我没有得到javascript错误.但是,$watch
返回数据时不会再次运行,因此我的视图无法正确反映模型.我尝试$scope.foo
在a中分配以在$timeout
返回数据后触发监视,但这似乎太依赖于时序而且不是很强大.
我的问题是在指令中与异步数据交互的正确方法是什么?我已经看到了一些示例,它们在指令中获取数据,如下所示:
scope.$eval(attrs.myAsyncData);
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何改变.除此之外,还有什么根本不同的东西myAsyncData: '='
吗?
我开始怀疑我是否应该通过服务获取数据,但似乎会出现完全相同的问题.我也想过直接在指令中获取数据,但我不想指令负责获取数据.我只希望指令负责显示数据并在用户与之交互时更新视图.
我可能会遗漏一些关于应该如何做的明显的事情,所以任何输入都会让我非常感激.
在我们的客户端上,可以上传大文件.我们希望使用分块来减少请求的大小.我们正在使用Plupload,所以很容易以块的形式发送文件.但是,我不知道如何处理这些块.我们在服务器上使用Spring MVC和我目前有我的控制器方法如下:uploadMedia(@RequestBody MultipartFile file)
这里MultipartFile
是org.springframework.web.multipart.MultipartFile
.这样可以在不进行分块时正常工作.当我打开客户端的分块时,它仍然可以很好地进入这个方法,但是我没有看到传递的文件中的任何内容,它标识了chunk所属的文件.希望我只是遗漏了一些东西.
看起来这是一个常见的工作流程,但我似乎无法找到在服务器端如何完成这一任务的任何好例子.只有Spring的解决方案会很棒,但是如果需要另一个库,那也没关系.我看了一下Apache Commons FileUpload,但我在那里找不到任何有关分块的信息.对此的任何帮助都会很棒.谢谢.
我知道并理解Java中接口的价值.您编写接口,然后您可以更改您的实现,而无需使用该接口更改任何代码.通常,术语"合同"与接口一起使用.我理解它的方式是接口定义应用程序和实现之间的"契约".
所以,当我创建一个实现时,我必须履行合同.我的问题是,我必须履行的合同究竟是什么?
显然,您必须至少提供与接口具有相同签名的方法.否则代码将无法编译.这是所有的"合同"吗?似乎应该有更多.
例如,我读过一些文章,讨论测试界面与测试特定实现的价值,或两者兼而有之.我认为对接口进行测试非常有价值,这样您就可以知道哪些输入具有预期的输出.在我看来,这也将是"合同"界面的一部分.接口的每个实现都应该从相同的输入产生相同的输出.显然,没有办法在代码中强制执行此合同,但可以通过测试用例强制执行.我的想法在这里错了吗?
最后,实现有哪些副作用?在这里,我主要讨论可能作为实现的一部分发生的任何持久性.假设我有一个实现,它会在执行操作时将一些记录保存到数据库中.这会以某种方式成为界面"合同"的一部分吗?如果是这样,你怎么能执行这份合同?从界面层面来看,我不知道实现实际上在做什么.我所知道的是我给它输入,它给了我一个输出,我可以测试.发生的任何持久性是否也被视为"输出"?如果是这样,我只是看不出如何测试和执行.我是坚持无知的支持者,所以我可以知道应该坚持某些东西,但我不知道它是如何持久存在的.所以,我只是不知道什么时候实际存在的东西.如果您的界面有一些简单的CRUD操作可能很简单,但我想考虑更复杂的界面.
我希望我的问题有道理,有人可以提供一些好的反馈.我想一般性地讨论这个问题,但如果我不清楚我在谈论什么,我可以提供一个具体的例子.
angularjs ×4
java ×3
javascript ×3
plupload ×2
spring ×2
annotations ×1
asynchronous ×1
chunking ×1
classpath ×1
file-upload ×1
interface ×1
io ×1
jasmine ×1
java-7 ×1
java-ee ×1
jta ×1
transactions ×1
unit-testing ×1