虽然我相信我按照这里的说明设置$ httpBackend将选定的请求传递给服务器,但它对我不起作用.
这是一个带有失败测试的Plunkr,它显示了我正在做的事情并在评论中解释了什么似乎出了问题.
我的洞察力表明,由于某种原因,模拟$httpBackend没有真实的内部副本,$httpBackend因此,当需要通过XHR请求时,它会将其传递给模拟$httpBackend.第二个调用抛出异常,因为它不知道如何处理请求.
我很遗憾地记得你在中途测试的帖子.您确定了一系列重要的集成测试,它们介于单元测试和E2E测试之间.我站在那个中间地带.
我觉得你根本不是很讽刺.你的答案是完全合理的......或者如果不与" API reference/ngMockE2E/$ httpBackend " 的文本相矛盾,那将是合理的.我引用:
此实现可用于经由所述静态或动态响应响应
whenAPI及其快捷方式(whenGET,whenPOST等)和任选地通过请求传递到实际$httpBackend用于特定请求(例如与某些远程的API交互或者从网络服务器获取模板) ...[I] n端到端测试场景或在使用模拟替换真实后端api开发应用程序的情况下,通常需要某些类别的请求绕过模拟并发出真实的http请求 ....要使用此行为配置后端,请使用
passThroughwhen 的请求处理程序而不是respond.[强调我的].
该文档没有提及$httpBackendJasmine环境中的E2E 使用问题.我想不出有理由排除它.如果有这样的理由,他们应该清楚说明.说真的,谁读了一个模拟组件,并没有预料到在测试环境中使用它?
" 将请求传递给真实$httpBackend的特定请求,例如与某些远程api进行交互 "正是我打算做的.除了该组件的非模拟版本之外,"真正的$ httpBackend"可能意味着什么呢?
我不明白你的说法
该
ngMocksE2E模块设计用于执行实际角度应用程序的"服务器"端.
"服务器"这个词在该页面上出现了3次,而不是曾经暗示任何应用程序代码都会在"服务器"上执行.我不知道你在"服务器"方面执行的"实际角度应用"是什么意思.
文档非常明确,E2E $httpBackend不仅限于E2E测试.它也适用于" 正在开发应用程序并将真实后端api替换为模拟 "的情况.
这距离我使用真正的后端api 测试应用程序的情况只有半步之遥."
在我的场景中,SUT正在调用从服务器获取数据的组件.我的测试用于验证此依赖组件是否成功完成了对真实后端的此类请求,并将以预期方式检索或保存数据.这是一种集成测试,通过模拟后端的行为无法充分满足.
当然,我可以使用模拟XHR响应来测试(并进行测试)组件能够正确响应我预测的后端行为.这与验证组件对 …
在我的例子中,我正在尝试扩展TS Window接口以包含polyfill fetch.为什么无所谓.问题是" 我怎么告诉TS这window.fetch是一个有效的函数? "
我在运行TS v.1.5(IIRC)的VS Code,v.0.3.0中这样做.
在我想要使用它的TS类文件中声明接口不起作用:
///<reference path="typings/tsd.d.ts"/>
interface Window {
fetch:(url: string, options?: {}) => Promise<any>
}
...
window.fetch('/blah').then(...); // TS objects that window doesn't have fetch
Run Code Online (Sandbox Code Playgroud)
但是如果我在一个单独的".d.ts"文件中声明这个相同的接口并在我的TS类文件中引用它,那就没关系.
这是"typings/window.extend.d.ts"
///<reference path="es6-promise/es6-promise"/>
interface Window {
fetch:(url: string, options?: {}) => Promise<any>
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在我的TS类文件中使用它:
///<reference path="typings/window.extend.d.ts"/>
...
window.fetch('/blah').then(...); // OK
Run Code Online (Sandbox Code Playgroud)
或者,我可以在我的TS类文件中使用另一个名称编写扩展接口,然后在强制转换中使用它:
interface WindowX extends Window {
fetch:(url: string, options?: {}) => Promise<any>
}
...
(<WindowX> window).fetch('/blah').then(...); // OK
Run Code Online (Sandbox Code Playgroud)
为什么扩展接口工作在"d.ts"而不是就地? …
我们的项目目前使用Silverlight来使用Odata服务.这使得生活变得非常简单,因为我们可以引用OData服务,从而为我们提供生成的服务引用/实体.
但是,我们是否应该转向Html(html5)进行讨论.如果我们做出这个改变,我想知道会发生什么.我们当然会利用像jQuery这样的框架.
谢谢!
我正在做一个durandal,breeze和knockout的应用程序.我已经开始实施一些测试了.我遇到的第一个问题是决定我应该测试什么,不测试什么.我知道我应该测试一切,但在一家小公司里并不总是可行的.
我的第二个问题是如何测试我对服务器的调用.我在微风页面上看到了一些关于测试的信息.我也见过DocCode示例.但我想知道更多关于如何做到这一点的意见.
我的问题是:
我想在客户列表的每一行上放置一个"删除"按钮和一个"取消"按钮.当客户"未更改"时,"取消"按钮被禁用.但是当客户转换到更改状态("已添加","已修改","已删除")时,我想启用"取消"按钮,以便用户可以在保存之前撤消更改 - 无论它们是什么.
我几乎可以通过订阅来做到这一点customer.entityAspect.propertyChanged.属性变化表示潜在的变化EntityState.我可以订阅该事件并让我的处理程序更新isChanged我已添加到我的Customer实体的observable.然后我绑定"取消"按钮启用isChanged,我很高兴.
但propertyChanged事件仅在数据属性发生变化时才会发生,例如customer.Name("New Co.");.用户单击"删除"按钮时不会引发此问题."删除"触发器customer.entityAspect.setDelete();不触及数据属性; 它只是改变了顾客的意志EntityState.
(1)为什么不改变客户的EntityState加注propertyChanged和(2)我如何监听改变,EntityState以便我可以控制"取消"按钮?
PS:我正在使用Knockout.
PPS:这个问题的灵感来自之前的SO问题" entityAspect.setDeleted不会触发订阅的propertyChanged事件 ".
朋友的查询失败了.幸运的是,他在失败的回调中捕获了它(你为每个服务器调用都有一个失败的回调,对吧?).这是他的所作所为:
var getPersons = function(personsObservable) {
return EntityQuery.from('Person')
.using(manager).execute()
.then(querySucceeded).fail(queryFailed);
}
function queryFailed(error) {
var msg = 'Error retreiving data. ' + error.message;
logError(msg, error);
throw error;
}
在error.message简单的显示JSON数据......它看起来有点像这样:
"[{"$id":"1","$type":"Person, ProjectName","Id":12,"FirstName":"Bob","LastName":"Smith","Email":"bs@contoso.com","Blog":"http://bs.contoso.com","Twitter": ..."
WAT?
他检查了error.XHR哪个提供了用于此查询的完整AJAX XHR对象.他可以看到HTTP状态代码是200 ...这意味着服务器上的一切都很酷.他有真实数据的事实几乎说了同样的事情.
那么为什么Breeze失败了呢?他如何诊断问题?
我试图找到一种方法,以一种类似于MVC中的ASP.NET(验证错误)的方式在HTML表格中正在编辑的字段下显示验证错误消息.
任何样品或链接将不胜感激.
这是我尝试过的.它没有立即更新错误消息,因为我认为它不是一个可观察的.
<script id="editTmpl" type="text/html">
<tr>
<td><input data-bind="value: Country_Code "/>
<div data-bind="if: $data.entityAspect.getValidationErrors().length>0">
<pre data-bind="text: $data.entityAspect.getValidationErrors('Country_Code')[0].errorMessage "></pre>
</div>
</td>
<td><input data-bind="value: Country_Name"/></td>
<td class="buttons">
<a class="btn btn-success" data-bind="click: $root.save" href="#" title="save"><i class="icon-ok"></i></a>
<a class="btn" data-bind="click: $root.cancel" href="#" title="cancel"><i class="icon-trash"></i></a>
</td>
</tr>
</script>
Run Code Online (Sandbox Code Playgroud) 我正在编写一个角度控制器,它对数据服务有依赖性(数据服务转到http服务器),我想模仿它的行为.
我正在使用一个名为bard js的库进行模拟,它有一个名为bard.mockService的模拟服务api .
在beforeEach语句中,我正在做:
beforeEach(function() {
bard.appModule('app.process.creation');
bard.inject('$controller', '$rootScope', '$q', 'processCreationDataservice');
bard.mockService(processCreationDataservice, {
createProcess: $q.when({}),
_default: $q.when([])
});
controller = $controller('ProcessCreationController');
$rootScope.$apply();
});
Run Code Online (Sandbox Code Playgroud)
然后我的测试:
it('should call create process data service to create process', function() {
controller.create();
expect(processCreationDataservice.createProcess).to.have.been.calledOnce;
});
Run Code Online (Sandbox Code Playgroud)
正如您在测试中看到的那样,我想声明dataservice.createProcess被调用一次.
控制器没有调用方法processCreationDataservice.createProcess,仍然测试正在通过.
(function() {
angular
.module('app.process.creation')
.controller('ProcessCreationController', ProcessCreationController);
ProcessCreationController.$inject = ['processCreationDataservice'];
function ProcessCreationController(processCreationDataservice) {
var vm = this;
vm.process = {
name: '',
bankId: ''
};
vm.create = function() {
};
}})();
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这个测试正在通过,我该怎么做才能断言该方法被调用一次.
我按照这些说明操作:https: //github.com/wardbell/bardjs#mockService