Soru Yasemin alay nesnesi bir yöntem nasıl?


Jasmine belgelerine göre, bu gibi bir alay yaratılabilir:

jasmine.createSpyObj(someObject, ['method1', 'method2', ... ]);

Bu yöntemlerden birini nasıl buluyorsunuz? Örneğin, bir yöntem bir istisna atarken ne olduğunu test etmek isterseniz, bunu nasıl yapacaksınız?


54
2017-11-30 10:01


Menşei


İle zincirleme deneyebilirsiniz andCallThrough. Açıkça belgelenmemiş: / - EricG


Cevaplar:


Zincirlemelisin method1, method2 EricG'nin söylediği gibi değil, andCallThrough() (veya and.callThrough() sürüm 2.0). Olacak gerçek uygulamaya delege.

Bu durumda zincirleme yapmanız gerekir and.callFake() ve çağrılmak istediğiniz işlevi iletin (istisna atabilir veya ne istersen):

var someObject = jasmine.createSpyObj('someObject', [ 'method1', 'method2' ]);
someObject.method1.and.callFake(function() {
    throw 'an-exception';
});

Ve sonra doğrulayabilirsiniz:

expect(yourFncCallingMethod1).toThrow('an-exception');

90
2017-11-30 15:19



Jasmine 2.0 sözdizimini değiştirdi .and.callFake(), .and.callThrough(), .and.returnValue()  jasmine.github.io/2.0/introduction.html#section-Spies - alxndr


Typescript'i kullanıyorsanız, yöntemi Jasmine.Spy. Yukarıdaki Cevap'ta (garip bir şekilde yorum yazamam):

(someObject.method1 as Jasmine.Spy).and.callFake(function() {
  throw 'an-exception';
});

Fazla mühendis olup olmadığımı bilmiyorum, çünkü bilgiden yoksun ...

Typescript için şunu istiyorum:

  • Altta yatan türden zeka
  • Sadece bir işlevde kullanılan yöntemleri alama becerisi

Bunu yararlı buldum:

namespace Services {
    class LogService {
        info(message: string, ...optionalParams: any[]) {
            if (optionalParams && optionalParams.length > 0) {
                console.log(message, optionalParams);
                return;
            }

            console.log(message);
        }
    }
}

class ExampleSystemUnderTest {
    constructor(private log: Services.LogService) {
    }

    doIt() {
        this.log.info('done');
    }
}

// I export this in a common test file 
// with other utils that all tests import
const asSpy = f => <jasmine.Spy>f;

describe('SomeTest', () => {
    let log: Services.LogService;
    let sut: ExampleSystemUnderTest;

    // ARRANGE
    beforeEach(() => {
        log = jasmine.createSpyObj('log', ['info', 'error']);
        sut = new ExampleSystemUnderTest(log);
    });

    it('should do', () => {
        // ACT
        sut.doIt();

        // ASSERT
        expect(asSpy(log.error)).not.toHaveBeenCalled();
        expect(asSpy(log.info)).toHaveBeenCalledTimes(1);
        expect(asSpy(log.info).calls.allArgs()).toEqual([
            ['done']
        ]);
    });
});

12
2018-05-17 16:52



Kabul edilen cevap benim için derleme yapmıyor (yasemin 2.5) ama bu çözüm işe yaradı! - Peter Morris
Mini iyileştirme - todoService: {[key: string]: jasmine.Spy} = jasmine.createSpyObj(...); todoService.anyMethod.and.... - Her seferinde Spy'a gitmeye gerek yok. - Kai
Teşekkürler @Kai, biraz ayrıntı ekledim. Dinamik bir Spy nesnesi yerine birincil tür olarak tür tanıma ihtiyacım vardı. Şahsen, nesnenin gerçek nesne gibi hareket etmesini ve hissetmesini istedim ve daha sonra test ettiğimde sadece Casus'a döktüm. - Eric Swanson


@Eric Swanson'un cevabı ile ilgili olarak, testlerimde kullanmak için daha iyi okunabilir ve belgelenmiş bir işlev oluşturdum. Ayrıca, parametreyi bir işlev olarak yazarak bir tür güvenlik ekledim.

Bu kodu, ortak bir test sınıfında bir yere yerleştirmenizi tavsiye ederim, böylece onu ihtiyaç duyulan her test dosyasında içe aktarabilirsiniz.

/**
 * Transforms the given method into a jasmine spy so that jasmine functions
 * can be called on this method without Typescript throwing an error
 *
 * @example
 * `asSpy(translator.getDefaultLang).and.returnValue(null);`
 * is equal to
 * `(translator.getDefaultLang as jasmine.Spy).and.returnValue(null);`
 *
 * This function will be mostly used in combination with `jasmine.createSpyObj`, when you want
 * to add custom behavior to a by jasmine created method
 * @example
 * `const translator: TranslateService = jasmine.createSpyObj('TranslateService', ['getDefaultLang'])
 * asSpy(translator.getDefaultLang).and.returnValue(null);`
 *
 * @param {() => any} method - The method that should be types as a jasmine Spy
 * @returns {jasmine.Spy} - The newly typed method
 */
export function asSpy(method: () => any): jasmine.Spy {
  return method as jasmine.Spy;
}

Kullanım aşağıdaki gibi olacaktır:

import {asSpy} from "location/to/the/method";

const translator: TranslateService = jasmine.createSpyObj('TranslateService', ['getDefaultLang']);
asSpy(translator.getDefaultLang).and.returnValue(null);

0
2017-07-13 11:32