Angular-Jasmine/karma-subscribe lambda表达式未执行

Angular-Jasmine/karma-subscribe lambda表达式未执行,angular,typescript,unit-testing,jasmine,karma-jasmine,Angular,Typescript,Unit Testing,Jasmine,Karma Jasmine,我正在使用Jasmine/karma为一个角度为6的可观测组件编写一个单元测试用例。请找到我正在为其编写测试用例的组件方法 public ngOnInit(): void { { this.editOrderContainer.getEditOrderState().subscribe(editOrderState => { this.shipAddressEditted = editOrderState.data.shipAddressEdited;

我正在使用Jasmine/karma为一个角度为6的可观测组件编写一个单元测试用例。请找到我正在为其编写测试用例的组件方法

public ngOnInit(): void {
{
   this.editOrderContainer.getEditOrderState().subscribe(editOrderState => {
            this.shipAddressEditted = editOrderState.data.shipAddressEdited;
            this.shipInstructionEditted = editOrderState.data.shipInstructionEditted;
            this.hasShippingDetailsChanged = (this.shipAddressEditted || this.shipInstructionEditted) && this.existedAffectedOrderNumbers;
        });
...
}
在上面的代码中,我的测试用例应该包含/期望变量“hassippingdetailschanged”。在spec文件中,我会有如下的“it”

.spec文件中的mocking/spy代码如下所示

let editOrderContainer: any;
let getEditOrderState: any;

beforeEach(async () => {
...
     editOrderContainer = jasmine.createSpyObj('editOrderContainer', ['getEditOrderState', 'rebookOrder']);
            editOrderContainer.getEditOrderState.and.callFake(() => {
                return getEditOrderState;
            });
            getEditOrderState = {
                subscribe: function () {
                    return getOrderDetailsServiceResult();
                }
            };
            spyOn(getEditOrderState, 'subscribe').and.callThrough();
            ...
 });

 function getOrderDetailsServiceResult() {
        return {
            shipAddressEditted: true,
            shipInstructionEditted : true
        };
    }
EditOrderContainer代码如下所示:

public getEditOrderState(): Observable<EditOrderState> {
        return this.store.select(s => s.editOrderReducer);
    }   
public getEditOrderState():可观察{
返回this.store.select(s=>s.editOrderReducer);
}   
我在这里面临的问题是,它在subscribe中为editOrderState返回值,而lambda表达式语句没有得到执行

i、 e.ShipAddressEdited、ShipInstructionEdited、HassippingDetailsChanged的赋值语句未执行。 我希望执行这些行,以便分配所需的变量HassippingDetails


知道我在这里犯了什么错吗?为什么未在spec文件中执行subscribe lambda表达式?

尝试使用
存根
,以便它也可以在其他地方重用。尝试以下更改:

  • editOrderContainer
    设置为构造函数中的
    public
  • 存根创建为
    EditOrderContainerStub
  • spec
    文件的
    提供程序中:

  • 我找到了答案,问题在于我为editOrderContainer及其方法getEditOrderState创建间谍的方式,该方法返回一个可观察的

    在我之前的代码中,
    Observable.of(editOrderState)
    缺失,这是必需的。另外,我不应该也不需要对
    subscribe
    方法进行mock/spy

    我的间谍对象如下所示

    editOrderContainer = jasmine.createSpyObj('editOrderContainer', ['getEditOrderState', 'rebookOrder']);
    editOrderContainer.getEditOrderState.and.callFake(() => {
                var editOrderState = getOrderDetailsServiceResult();
                return Observable.of(editOrderState);
            });
    
    
     function getOrderDetailsServiceResult() {
            return {
                    data: {
                            shipAddressEdited: true,
                            shipInstructionEditted: true
                        }
                    };
        }
    

    不,它没有解决问题。尽管如此,即使在执行了you@Krishnan:您是否已设置
    组件。existedaffectordernumbers=true
    ?让我更新我的代码
    constructor(public editOrderContainer: EditOrderContainer,.....)
    
    export class EditOrderContainerStub{
       getEditOrderState(){
         return of({
           data: {
              shipAddressEditted: true,
              shipInstructionEditted : true
            }
         })
       }
    }
    
    
    beforeEach(async () => {
        providers:[{provide: EditOrderContainer , useClass: EditOrderContainerStub}],
    
    //....... your declaration
    
    });
    
    it('verify if Shipping instructions text is set to true if instructions test is changed.', () => {
         component.existedAffectedOrderNumbers = true;
         component.ngOnInit();
         expect(component.hasShippingDetailsChanged).toBeTruthy();
     });
    
    
    editOrderContainer = jasmine.createSpyObj('editOrderContainer', ['getEditOrderState', 'rebookOrder']);
    editOrderContainer.getEditOrderState.and.callFake(() => {
                var editOrderState = getOrderDetailsServiceResult();
                return Observable.of(editOrderState);
            });
    
    
     function getOrderDetailsServiceResult() {
            return {
                    data: {
                            shipAddressEdited: true,
                            shipInstructionEditted: true
                        }
                    };
        }