web-dev-qa-db-fra.com

Vérifier qu'une méthode est appelée ou non dans le test unitaire

J'ai un test unitaire je vérifie si une méthode est appelée une fois ou non alors j'ai essayé de cette façon: -

Ceci est ma maquette de ILicenseManagerService et je passe son objet à travers le constructeur.

public Mock<ILicenseManagerService> LicenseManagerService { get { return SetLicenseManagerServiceMock(); } }

    private Mock<ILicenseManagerService> SetLicenseManagerServiceMock()
    {
        var licencemangerservicemock = new Mock<ILicenseManagerService>();
        licencemangerservicemock.Setup(m => m.LoadProductLicenses()).Returns(ListOfProductLicense).Verifiable();

        return licencemangerservicemock;
    }

    public static async Task<IEnumerable<IProductLicense>> ListOfProductLicense()
    {
        var datetimeoffset = new DateTimeOffset(DateTime.Now);

        var lst = new List<IProductLicense>
        {
            GetProductLicense(true, datetimeoffset, false, "1"),
            GetProductLicense(true, datetimeoffset, false, "2"),
            GetProductLicense(true, datetimeoffset, true, "3")
        };

        return lst;
    }

J'utilise cet objet factice pour définir _licenseManagerService et j'appelle LoadProductLicenses () dans la méthode en cours de test. comme ça. les licences arrivent très bien.

var licenses = (await _licenseManagerService.LoadProductLicenses()).ToList();

Ma tentative de vérification de l'appel à cette méthode -

 LicenseManagerService.Verify(m => m.LoadProductLicenses(),Times.Once);

Mais lorsque j'exécute mon test unitaire, une exception arrive indiquant que la méthode n'est pas du tout invockée. où je me trompe?

MODIFIER @dacastro J'invoque la même maquette ici est mon test unitaire.

[TestMethod]
    [TestCategory("InApp-InAppStore")]
    public async Task return_products_from_web_when_cache_is_empty()
    {
        // this class basically for setting up external dependencies
        // Like - LicenceManagerService in context, i am using this mock only no new mock.
        var inAppMock = new InAppMock ();                  


        // object of Class under test- I used static method for passing external         
        //services for easy to change 
        var inAppStore = StaticMethods.GetInAppStore(inAppMock);

        // method is called in this method
        var result = await inAppStore.LoadProductsFromCacheOrWeb();

        // like you can see using the same inAppMock object and same LicenseManagerService
        inAppMock.LicenseManagerService.Verify(m => m.LoadProductLicenses(),Times.Once);


    }
16
loop
LicenseManagerService.Verify(m => m.LoadProductLicenses(),Times.Once);

En appelant la propriété LicenseManagerService, vous créez un objet maquette new. Naturellement, aucune invocation n'a jamais été effectuée sur cette instance.

Vous devez modifier l'implémentation de cette propriété pour renvoyer la même instance à chaque appel.

21
dcastro