Karma + Jasmine(角度测试):我应该在哪里定义模拟类和测试变量?

时间:2018-12-13 11:36:07

标签: javascript angular typescript jasmine karma-runner

让我们举一个例子:

const listDefinition: any = {
    module: "module",
    service: "service",
    listname: "listname"
};

@Component(...)
class MockTreeExpanderComponent extends TreeExpanderComponent {...}

class MockListConfigurationsService extends ListConfigurationsService {...}

describe('ColumnsListConfigurationsComponent Test cases', () => {
    let fixture: ComponentFixture<ColumnsListConfigurationsComponent>;
    let component: ColumnsListConfigurationsComponent;
    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [
                ComponentToTest,
                MockTreeExpanderComponent
            ],
            providers: [
                 { provide: TreeListConfigurationService, useClass: MockTreeListConfigurationService }
            ]
        });
        fixture = TestBed.createComponent(ComponentToTest);
        component = fixture.componentInstance;
        component.listDefinition = listDefinition;
        fixture.detectChanges();
    });
});

如您所见,我有一个模拟组件(MockListViewerGridComponent)和服务(ListConfigurationsService),一个配置变量(listDefinition)以及要测试的灯具和组件

我的问题是关于performancetest memory management

  1. describe方法内部实例化的变量是否会在describe内部的所有测试完成后立即销毁?
  2. 我应该在describe内声明所有变量和模拟类/服务吗?
  3. 我应该在beforeEachbeforeAll中创建一个灯具吗?这样,我会提高性能吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

我对第3点有一个答案

让我与beforeEach分享我自己的经验。

我们在其中一个应用程序中使用了each unit of work夹具创建,这花了将近12分钟的时间来构建整个应用程序。对于1st time client side

我们必须构建应用程序

2nd time on review branch

3rd time release branch

30 min

几乎花了unit of work(合计)来提交head count of resources

这次与beforeEach(宾果游戏团队)一起使用了多个,我们只在应用程序构建过程中浪费了很多时间。

在某个时候,我们借助this articlebeforeAll替换为providers: [ { provide: XService, useClass: XServiceStub } ] ,它开始工作了。我们能够将构建时间减少大约80%。

第1点和第2点的简短答案

1)是

2)最好创建单独的模拟服务。 您可以在所有块之前的存根的帮助下为其提供对象,并将所有模拟保存在同一文件夹中。

//server.js
const io=require('socket.io')();

io.on('connect',(s)=>{
    s.emit('message',{test:'data'});
    setTimeout(()=>{
        s.emit('message',{test:'another data'})
    },1500)
})
io.listen(8080);

//client.js
<!DOCTYPE html>
<html>
<head>
    <script src='http://127.0.0.1:8080/socket.io/socket.io.js'></script>
</head>
<body onload='testConnect()'>
    <script>
        function testConnect(){
            socket=io.connect('http://127.0.0.1:8080');
            socket.on('message',(msg)=>{
                console.log('received a message');
                console.log(msg);
            })
        }
    </script>
</body>
</html>

答案 1 :(得分:1)

在我的项目中,我总是在单独的文件中创建模拟类和测试变量。将它们导入我的规范文件后,我将它们声明为beforeEach块:

  1. 主要优点是,每个IT块之前,它都会重置其先前的值引用。
  2. 未使用的变量将从内存中删除,从而提高了性能。

我希望这对您有帮助