Skip to main content

Can we mock an extension method?

Pentru teste mai mult ca sigur ati folosit un framework petru a face mock pe diferite obiecte. In general am folosit Moq pentru a putea face mock la date. Este destul de usor de folosit, mai jos puteti sa gasiti un exemplu:
Mock<IService> serviceMock = new Mock<IService>();
serviceMock
    .Setup(x=>x.Call(It.IsAny<string>))
    .Returns(()=> new Result());
Mai sus am creat un mock pentru IService, iar in momentul in care se apeleaza metoda Call cu orice parametru de tip string, se returneaza un nou obiect de tip Result.
Nimic deosebit pana acuma. Dar ce se intampla daca vrem sa facem mock la un extension method. Vestea proasta este ca nu se poate face. Majoritatea framework-urilor pentru mock-ing nu suporta aceasta functionalitate.
Cea mai buna solutie este sa refactorizam codul daca putem. Dar exista cazuri cand acest lucru nu il putem face sau extension method nu este declarat de noi si vine dintr-un assembly exterior.
O solutie comuna, care poate sa fie folosita atat pentru aplicatiile .NET classic, Silverlight, WP7, ... este sa injectam actiunea care apeleaza metoda noastra. De exemplu putem sa extragem intr-un Action actiunea care apeleaza extension method, iar aceasta sa fie injectata prin contructor folosind un factory de exemplu. O alta varianta este sa facem un wrapper peste clasa noastra.
Urmatoarea solutie nu functioneaza pe Silverlight din pacate. Ar fi fost nice sa fie suportatat macar in versiunea 5, dar nici o sansa. Solutie se refera la folosirea Microsoft Moles. Prin intermediul acestui framework putem sa inlocuim orice clasa, metoda cu un mole care sa faca ce vrem noi. Un mole, intercepteaza apelul spre o anumita metoda si se poate executa orice alt cod. Putem sa facem mole la orice fel de metoda, atat statica cat si extension method.

Comments

  1. Un extension method nu e decat o metoda statica, deci nu e de mirare ca majoritatea frameworkurilor de mocking care lucreaza cu metode "ortodoxe" nu au cum sa creeze un mock pentru asa ceva..

    Si Moles sau Typemock Isolator pot sa mockuiasca o metoda statica pentru ca se baga cu CLR profiler-ul si rescriu IL-ul, si alte ghidusii de genul.

    ReplyDelete
  2. Partea interesanta este cand ai un proiect Silverlight si nu ai aceste optiuni.
    Daca ar fi sa aleg intre Moles si Moq as alege Moq, dar uneori nu ai de ales, sau in cazul asta numarul de optiuni este egal cu 0.

    ReplyDelete
  3. Da, in cazul acesta daca mocking framework-ul nu are versiune de Silverlight, cam singura optiune e un adapter sau refactoring daca e posibil..

    ReplyDelete
  4. Am ajuns la o solutie asemanatoare. Putin de refactoring, un factory impreuna cu un adaptor. O sa revin maine cu implementarea exacta.

    ReplyDelete

Post a Comment

Popular posts from this blog

How to audit an Azure Cosmos DB

In this post, we will talk about how we can audit an Azure Cosmos DB database. Before jumping into the problem let us define the business requirement: As an Administrator I want to be able to audit all changes that were done to specific collection inside my Azure Cosmos DB. The requirement is simple, but can be a little tricky to implement fully. First of all when you are using Azure Cosmos DB or any other storage solution there are 99% odds that you’ll have more than one system that writes data to it. This means that you have or not have control on the systems that are doing any create/update/delete operations. Solution 1: Diagnostic Logs Cosmos DB allows us activate diagnostics logs and stream the output a storage account for achieving to other systems like Event Hub or Log Analytics. This would allow us to have information related to who, when, what, response code and how the access operation to our Cosmos DB was done. Beside this there is a field that specifies what was th...

Cloud Myths: Cloud is Cheaper (Pill 1 of 5 / Cloud Pills)

Cloud Myths: Cloud is Cheaper (Pill 1 of 5 / Cloud Pills) The idea that moving to the cloud reduces the costs is a common misconception. The cloud infrastructure provides flexibility, scalability, and better CAPEX, but it does not guarantee lower costs without proper optimisation and management of the cloud services and infrastructure. Idle and unused resources, overprovisioning, oversize databases, and unnecessary data transfer can increase running costs. The regional pricing mode, multi-cloud complexity, and cost variety add extra complexity to the cost function. Cloud adoption without a cost governance strategy can result in unexpected expenses. Improper usage, combined with a pay-as-you-go model, can result in a nightmare for business stakeholders who cannot track and manage the monthly costs. Cloud-native services such as AI services, managed databases, and analytics platforms are powerful, provide out-of-the-shelve capabilities, and increase business agility and innovation. H...

Cloud Myths: Migrating to the cloud is quick and easy (Pill 2 of 5 / Cloud Pills)

The idea that migration to the cloud is simple, straightforward and rapid is a wrong assumption. It’s a common misconception of business stakeholders that generates delays, budget overruns and technical dept. A migration requires laborious planning, technical expertise and a rigorous process.  Migrations, especially cloud migrations, are not one-size-fits-all journeys. One of the most critical steps is under evaluation, under budget and under consideration. The evaluation phase, where existing infrastructure, applications, database, network and the end-to-end estate are evaluated and mapped to a cloud strategy, is crucial to ensure the success of cloud migration. Additional factors such as security, compliance, and system dependencies increase the complexity of cloud migration.  A misconception regarding lift-and-shits is that they are fast and cheap. Moving applications to the cloud without changes does not provide the capability to optimise costs and performance, leading to ...