- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含以下部分的 Angular 组件:
my.component.html(节选)
<button pButton
class="download ui-button ui-button-secondary"
(click)="exportFile(logEvent)"
icon="fas fa-file-download">
</button>
my.component.ts(节选)
import {saveAs} from 'file-saver';
exportFile(logEvent: LogEvent) {
saveAs(new Blob([logEvent.details]), 'log-details.txt');
}
这在我的应用程序中非常有效。我现在想在我的单元测试中对此进行测试。在寻找确保调用 saveAs() 的方法时,我偶然发现了两篇 stackoverflow 文章:mocking - Testing FileSaver in Angular 5和 Do you need spies to test if a function has been called in Jasmine? .基于此,我编写了以下测试:
my.component.spec.ts(摘录)
import * as FileSaver from 'file-saver';
beforeEach(() => {
spyOn(FileSaver, 'saveAs').and.stub();
});
it('should download a file if the download button is clicked', (fakeAsync() => {
// fakeAsync because in my real test, there are httpClient test aspects as well
advance(fixture);
expect(page.downloadButton).toBeDefined();
click(page.downloadButton);
advance(fixture);
expect(FileSaver.saveAs).toHaveBeenCalled();
}));
这两个辅助方法来自 Angular Testing Example :
export function advance(f: ComponentFixture<any>): void {
tick();
f.detectChanges();
}
export const ButtonClickEvents = {
left: {button: 0},
right: {button: 2}
};
export function click(el: DebugElement | HTMLElement, eventObj: any = ButtonClickEvents.left): void {
if (el instanceof HTMLElement) {
el.click();
} else {
el.triggerEventHandler('click', eventObj);
}
}
我的问题是,测试失败,输出如下:
Error: Expected spy saveAs to have been called.
Error: 1 timer(s) still in the queue.
所以看起来 stub 和断言似乎都不起作用。
如果我从 testm 中删除 click()
调用,1 timer(s) still in the queue
错误不再显示,所以我收集到 click( ) 方法起作用并触发真正的 saveAs()
调用——我想用 spy /模拟替换它。
我该如何解决这个问题?
更新,考虑到建议的解决方案:
我。按照 SiddarthPal 的建议将 my.component.spec.ts 中的导入更改为:
import * as FileSaver from 'file-saver';
没有任何区别。测试仍然导致两个断言错误。
二。按照 uminder 的建议将 spy 设置更改为:
spyOn(FileSaver, 'saveAs').and.callFake(() => null);
也没有什么区别。测试仍然导致两个失败的断言。
我试过如下编写 spy 模拟:
spyOn(FileSaver, 'saveAs').and.callFake(() => {
console.log('--- faking saveAs ---');
return null;
});
检查 Karma 服务器的输出,我在任何地方都看不到这个,所以看起来 spy 根本没有捕捉到我的组件对 saveAs() 的调用。
三。 uminder 的替换建议:
click(page.downloadButton);
advance(fixture);
与
click(page.downloadButton);
flush();
确实会消耗挂起的计时器错误。然而,onyl 隐藏了一个事实,即使用了真正的 saveAs()
调用,而不是 spy /模拟。所以我仍在寻找方法让它发挥作用。
最佳答案
好吧,我现在正在努力解决完全相同的问题。我的 spy 也不工作,它调用真正的 FileSaver 方法。这里的建议也没有解决我的问题。
我认为问题在于,FileSaver 不是适当的 Angular 模块的一部分,它只是从 FileSaver.js 导入的.我在模拟方面遇到了非常相似的问题,在 this 中有所描述。线。Tl;dr:我通过从 Funnel
的 import
用法切换到声明 FunnelProvider
并将其注入(inject)我的构造函数来解决该问题真正的方法如:
constructor(private funnelProvider: FunnelProvider) {}
然后在规范文件中我能够模拟该提供者。
我想,好吧,也许有一个 FileSaver.js 包装器库可以为我提供 Angular 服务,然后 is .但是依赖项已经过时了……这可能是个问题。但是从 FileSaver.js 切换到 angular-file-saver 应该是一个简单的改变。
我现在能想到的唯一其他解决方案是自己将 FileSaver 用法包装到它自己的 Angular 模块中。然后导入该模块并将新构建的 FileSaverService 注入(inject)到您的真实类中。在 spec 文件中,您可以执行以下操作:
describe("MyComponent", () => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
let fileSaverServiceSpy: jasmine.SpyObj<FileSaverService>;
beforeEach(() => {
fileSaverServiceSpy= jasmine.createSpyObj('FileSaverService', ['saveAs']);
TestBed
.configureTestingModule({
declarations: [
MyComponent
],
providers: [
{ provide: FileSaverService, useValue: fileSaverServiceSpy }
]
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
});
});
it('saveMyFile() should call FileSaver', () => {
fileSaverServiceSpy.saveAs.and.stub();
MyComponent.saveMyFile("testFileName");
expect(fileSaverServiceSpy.saveAs).toHaveBeenCalled();
});
});
然而,为了让 spy 工作,所有这一切似乎都需要大量工作。
编辑:我正在一个 angular 9 项目上测试它,这些是我的相关依赖项:
"@angular/core": "9.1.12",
"jasmine-core": "3.6.0",
"jasmine-spec-reporter": "6.0.0",
"karma": "5.2.3",
"karma-coverage-istanbul-reporter": "3.0.3",
"karma-firefox-launcher": "^2.0.0",
"karma-jasmine": "4.0.1",
"karma-jasmine-html-reporter": "1.5.4",
"karma-typescript": "5.2.0",
关于Angular 7 : Mocking FileSaver. 在单元测试中另存为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59281306/
我有一段代码是这样的: while(count = inputStream.readLine()) != null) { //do something } 在单元测试用例中,我正在模拟 inp
我有一段代码是这样的: while(count = inputStream.readLine()) != null) { //do something } 在单元测试用例中,我正在模拟 inp
假设我在文件中具有以下命名导出 customer.ts export const saveDetails = ()=>{} export const loadDetails = ()=>{} 假设我在
我一直试图绕过dart的模拟库,但似乎我仍然不明白。 在我的库中,我有一个对外部资源的HTTP请求,我想以此模拟它不要一直依赖外部资源。 我的库中的主类如下所示: SampleClass(String
使用 postman 模拟服务器存在问题。它不响应具有路由参数的请求。例如,我的 uri 如下所示: PUT : {{server_url}}/order/{id} 但是当我以这种方式调用模拟服务器时
将任何转换器或空属性转换添加到 Jest 配置时,模拟无法正常工作。下面是简单的代码。 Jest 配置: "transform": { any regex: any transformer } 模块说
我最近一直在做一个项目,该项目已经开始变得相当依赖,并且一直在探索使用 AutoMocking 容器来清理我的测试并使其不那么脆弱的想法。 我听说过 TDD/BDD 纯粹主义者反对使用它们的论点,例如
有谁知道为什么 UsernameExists 不会返回 True。我的语法一定在某个地方搞砸了。 [TestMethod()] public void GenerateUsername
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我得到一个 Moq 对象以在连续调用方法时返回不同的值。这是通过此扩展方法完成的: public static void ReturnsInOrder(this ISetup setup, param
rhino-mocks stub 和这里的期望有什么区别:在我看来它们的行为完全相同? mockContext.Stub(x => x.Find()) .Return(new List()
我正在尝试模拟方法 extra_get() 的调用,该方法通常返回一个字典列表。据我从模拟docs了解,如果我想返回iterable,我应该设置side_effect参数。 client.extra_
在我的 CentOS 6.2 机器的/var/lib/mock 文件夹下,我可以看到目标构建操作系统中的所有初始应用程序。如果我想添加 JDK 作为额外的应用程序,我该怎么做?谢谢! 最佳答案 只需将
我正在寻找一种让 stub 的返回值取决于其输入的干净方法。 目前我正在使用以下方法,但效果不佳。 metadataLogic.Expect(x => x.GetMake(args.Vehicle1.
我正在设置调用构建和执行查询的方法的期望。我想询问所用参数的属性。这可能吗 using (mocks.Record()) { Expect.Call(connection.Retrieve(S
有没有人有一个使用 Rhino Mocks 和 NInject 的自动模拟容器的实现? 最佳答案 好的,我使用 Moq 集成作为起点自己构建了一个。这很简单。你需要这 3 个类: public cla
使用后@patch在我的装饰器上它不再起作用了。我想进行一个失败并引发异常的调用,以便我可以检查我的装饰器是否正在捕获此异常,并正在调用某个函数。 mock do_sth_in_db让它引发异常是很容
谁能告诉我为什么下面的测试没有失败? [Test] public void uhh_what() { var a = MockRepository.GenerateMock(); a.
我找不到 Moq 和 Rhino 的具体功能比较。所有的问题都是“你更喜欢哪个以及为什么”,或者“这是你如何在 rhino 中进行简单的模拟以及如何在最小起订量中完成的”。 我在任何地方都找不到深入的
我正在尝试模拟数据存储库对象,但在 MockRepository 上设置期望后,它每次都返回 null。我的代码如下: [测试] 公共(public)无效 GetById_NotNull() { 预
我是一名优秀的程序员,十分优秀!