Skip to main content

externalExpectation <Actual>

Defines an expectation to be used with Wait.until, Check.whether, Ensure.that and as part of the Page Element Query Language with PageElements.where and List.where.

Hierarchy

Index

Methods

staticexternaldefine

  • define<Actual_Type, PredicateArguments>(functionName: string, relationship: Answerable<string> | (...answerableArguments: AnswerableArguments<PredicateArguments>) => Answerable<string>, predicate: (actual: Actual_Type, ...predicateArguments: PredicateArguments) => boolean | Promise<boolean>): (...answerableArguments: AnswerableArguments<PredicateArguments>) => Expectation<Actual_Type>
  • A factory method to that makes defining custom expectations easier

    Defining a custom expectation

    import { Expectation } from '@serenity-js/core'
    import { PageElement } from '@serenity-js/web'

    const isEmpty = Expectation.define(
    'isEmpty', // name of the expectation function to be used when producing an AssertionError
    'become empty', // human-readable description of the relationship between expected and actual values
    async (actual: PageElement) => {
    const value = await actual.value();
    return value.length === 0;
    }
    )

    Using a custom expectation in an assertion

    import { Ensure } from '@serenity-js/assertions'
    import { actorCalled } from '@serenity-js/core'
    import { By, Clear, PageElement } from '@serenity-js/web'

    const nameField = () =>
    PageElement.located(By.css('[data-test-id="name"]')).describedAs('name field');

    await actorCalled('Izzy').attemptsTo(
    Clear.the(nameField()),
    Ensure.that(nameField(), isEmpty())
    )

    Using a custom expectation in a control flow statement

    import { not } from '@serenity-js/assertions'
    import { actorCalled, Check, Duration, Wait } from '@serenity-js/core'
    import { By, PageElement } from '@serenity-js/web'

    const nameField = () =>
    PageElement.located(By.css('[data-test-id="name"]')).describedAs('name field');

    await actorCalled('Izzy').attemptsTo(
    Check.whether(nameField(), isEmpty())
    .andIfSo(
    Enter.theValue(actorInTheSpotlight().name).into(nameField()),
    ),
    )

    Using a custom expectation in a synchronisation statement

    import { not } from '@serenity-js/assertions'
    import { actorCalled, Duration, Wait } from '@serenity-js/core'
    import { By, PageElement } from '@serenity-js/web'

    const nameField = () =>
    PageElement.located(By.css('[data-test-id="name"]')).describedAs('name field');

    await actorCalled('Izzy').attemptsTo(
    Enter.theValue(actorInTheSpotlight().name).into(nameField()),

    Wait.upTo(Duration.ofSeconds(2))
    .until(nameField(), not(isEmpty())),
    )

    Learn more


    Type parameters

    • Actual_Type
    • PredicateArguments: unknown[]

    Parameters

    • externalfunctionName: string

      Name of the expectation function to be used when producing an AssertionError

    • externalrelationship: Answerable<string> | (...answerableArguments: AnswerableArguments<PredicateArguments>) => Answerable<string>

      Human-readable description of the relationship between the expected and the actual values. Used when reporting activities performed by an actor

    • externalpredicate: (actual: Actual_Type, ...predicateArguments: PredicateArguments) => boolean | Promise<boolean>

    Returns (...answerableArguments: AnswerableArguments<PredicateArguments>) => Expectation<Actual_Type>

      • (...answerableArguments: AnswerableArguments<PredicateArguments>): Expectation<Actual_Type>
      • Parameters

        • externalrest...answerableArguments: AnswerableArguments<PredicateArguments>

        Returns Expectation<Actual_Type>

staticexternalthatActualShould

  • thatActualShould<Expected_Type, Actual_Type>(relationshipName: string, expectedValue?: Answerable<Expected_Type>): { soThat: (simplifiedPredicate: (actualValue: Actual_Type, expectedValue: Expected_Type) => boolean | Promise<boolean>) => Expectation<Actual_Type> }
  • Used to define a simple Expectation

    Simple parameterised expectation

     import { actorCalled, Expectation } from '@serenity-js/core'
    import { Ensure } from '@serenity-js/assertions'

    function isDivisibleBy(expected: Answerable<number>): Expectation<number> {
    return Expectation.thatActualShould<number, number>('have value divisible by', expected)
    .soThat((actualValue, expectedValue) => actualValue % expectedValue === 0);
    }

    await actorCalled('Erica').attemptsTo(
    Ensure.that(4, isDivisibleBy(2)),
    )

    Type parameters

    • Expected_Type
    • Actual_Type

    Parameters

    • externalrelationshipName: string

      Name of the relationship between the actual and the expected. Use format have value <adjective> so that the description works in both positive and negative contexts, e.g. Waited until 5 does have value greater than 2, Expected 5 to not have value greater than 2.

    • externaloptionalexpectedValue: Answerable<Expected_Type>

    Returns { soThat: (simplifiedPredicate: (actualValue: Actual_Type, expectedValue: Expected_Type) => boolean | Promise<boolean>) => Expectation<Actual_Type> }

    • externalsoThat: (simplifiedPredicate: (actualValue: Actual_Type, expectedValue: Expected_Type) => boolean | Promise<boolean>) => Expectation<Actual_Type>
        • (simplifiedPredicate: (actualValue: Actual_Type, expectedValue: Expected_Type) => boolean | Promise<boolean>): Expectation<Actual_Type>
        • Parameters

          • externalsimplifiedPredicate: (actualValue: Actual_Type, expectedValue: Expected_Type) => boolean | Promise<boolean>

          Returns Expectation<Actual_Type>

staticexternalto

  • to<Actual_Type>(relationshipName: string): { soThatActual: (expectation: Expectation<Actual_Type>) => Expectation<Actual_Type> }
  • Used to compose expectations.

    Composing expectations

    import { actorCalled, Expectation } from '@serenity-js/core'
    import { Ensure, and, or, isGreaterThan, isLessThan, equals } from '@serenity-js/assertions'

    function isWithin(lowerBound: number, upperBound: number) {
    return Expectation
    .to(`have value within ${ lowerBound } and ${ upperBound }`)
    .soThatActual(
    and(
    or(isGreaterThan(lowerBound), equals(lowerBound)),
    or(isLessThan(upperBound), equals(upperBound)),
    )
    )
    }

    await actorCalled('Erica').attemptsTo(
    Ensure.that(5, isWithin(3, 6)),
    )

    Type parameters

    • Actual_Type

    Parameters

    • externalrelationshipName: string

      Name of the relationship between the actual and the expected. Use format have value <adjective> so that the description works in both positive and negative contexts, e.g. Waited until 5 does have value greater than 2, Expected 5 to not have value greater than 2.

    Returns { soThatActual: (expectation: Expectation<Actual_Type>) => Expectation<Actual_Type> }

externaldescribedBy

  • Resolves the description of this object in the context of the provided actor.


    Parameters

    Returns Promise<string>

externaltoString

  • toString(): string
  • Returns a human-readable description of this object.


    Returns string

externalisMetFor

externaldescribedAs

  • describedAs(description: Answerable<string>): this
  • @inheritDoc

    Parameters

    Returns this