Votre approche présente plusieurs problèmes. Pour commencer, vous ne pouvez que truquer des méthodes virtuelles (ou abstraites, ou des méthodes définies sur des interfaces). Je suppose que WebService.WebServiceClient.getCustomerName
n'est pas virtuel, alors voici une alternative à la réponse de @ Micael qui vous permettra de contourner cela. Je l'ai utilisé plusieurs fois dans le passé:
Comme le dit Micael, créez plutôt une interface qui contient les fonctionnalités fournies par le service Web.
public interface ICustomerData
{
CustomerName GetCustomerName(CustomerNumber number);
}
Ensuite, vous pouvez faire votre collaborateur de production CustomerData
comme il l'a fait, ou si WebService.WebServiceClient
n'est pas scellé, vous pouvez le faire:
public class CustomerData: WebService.WebServiceClient, ICustomerData
{}
Vous aurez besoin de trouver un moyen de fournir une implémentation de ICustomerData
à votre code de production de sorte que vous pouvez utiliser l'implémentation réelle pendant la production et un faux pendant les tests dont je parle maintenant:
Le deuxième problème est que dans votre test, vous essayez de faux appels à WebServiceClient.CustomerNumber
, qui me semble être un type, pas un objet réel avec lequel vous avez affaire. A la suite le long de notre étape ci-dessus, vous voulez faux l'interface ICustomerData
:
var fakeCustomerData = A.Fake<ICustomerData>();
var someCustomerName = getACustomerNameSomehow();
A.CallTo(() => fakeCustomerData.GetCustomerName(A<CustomerNumber>.Ignored)
.Returns(someCustomerName);
Cela fera en sorte vos déclarations fausses someCustomerName
chaque fois que GetCustomerName
est appelé. J'ai changé someCustomerName
d'un faux parce que vous ne pouvez pas avoir besoin d'être un faux - s'il est facile de créer un objet CustomerName
pour revenir de votre faux service, je ferais juste cela.Seulement si vous avez besoin de changer son comportement, ou il est presque impossible de créer, j'utiliserais un faux.
Après le faux est configuré, vous devez appeler une méthode sur votre classe de production (qui vous dit a été appelé CustomerName
, tout comme le type de retour GetCustomerName
?), Qui finira par appeler le collaborateur ICustomerData
. Dans votre code d'origine, vous appelez directement une méthode sur le faux, qui ne teste que le faux, pas votre propre code. Donc à la place, vous pourriez avoir quelque chose comme
var customerNameService = new CustomerName(fakeCustomerData);
var foundCustomerName = customerNameService.GetACustomerNameFromANumber(someCustomerNumber);
// in my imagination, GetACustomerNameFromANumber calls ICustomerData.GetCustomerName
// now do something to check if the foundCustomerName is right, or whatever
Que la même chose peut être fait en utilisant FakeItEasy? – Shan