Fake test dependency

It is very common that the SUT depends on something else. The dependency could be anything like another function, object or external system and we may not be able to control their behavior all the time. A good unit test should not be affected by the changes in the dependencies of SUT.

So, a common technique is to replace the dependencies with fake versions that we can control.

For example, consider a function that takes age of the passenger and prints whether he/she is eligible for senior citizen discount when promotion is available.

The function which tells whether the promotion is available or not is defined in another module and we don’t have control over its behavior

module promotions
    function isPromotionsAvailable():
        .
        .
        .
module discounts

function isDiscountAvailable(age):
    if promotions.isPromotionAvailable() && age > 60:
        print("discount available")
    else:
        print("discount not available")

However, in order to test all the branches and conditions of isDiscountAvailable() function, we need to be able to control the result of isPromotionAvailable() function. So, we first create fake version of isPromotionAvailable() function in fakePromotions module with an option for us to control the result

module fakePromotions
    offerPromotion = true

    function isPromotionAvailable():
        return offerPromotion

then replace the promotion with fakePromotion inside the test

function test_isDiscountAvailable():
    // arrange
    promotions  = fakePromotions  //replace promotions module with fakePromotions module
    promotions.offerPromotion = true
    age = 65

    // act
    result = discounts.isDiscountAvailable(age)

Depending on the language and framework we use, the way we replace the real dependency with fake one will be different.

comments powered by Disqus