2011-04-12 2 views
1

Je veux tester une classe qui utilise Linq to SQL. J'ai truqué le datacontext avec TypeMock Isolator, mais le datacontext a aussi une fonction que je ne sais pas comment truquer. Cette fonction est utilisée dans les requêtes Linq to Sql.Comment fausser une méthode datacontext avec TypeMock Isolator

La fonction passe deux arguments (int? A, chaîne b) et renvoie un entier; DC.MonMethod (int? A, chaîne b)

Comment puis-je faire semblant?

//Fake datacontext 
var fakeDC = Isolate.Fake.Instance<MyDataContext>(); 

//Fake --> this doesn't work 
Isolate.WhenCalled((int? a, string b) => fakeDC.MyFunction(a,b).... ? 

espoir quelqu'un peut aider

+0

"Ne fonctionne pas" n'est pas une description d'erreur. Qu'est-ce qui se passe? –

+0

Ne vous moquez pas. Abstract it away: http://bit.ly/gHLubu. – Steven

Répondre

3

Isolateur par défaut ne tient pas compte des arguments passés aux fonctions. Pour faux vôtre, vous pouvez simplement utiliser:

Isolate.WhenCalled(() => fakeDC.MyFunction(null, null)).WillReturn(...) 

Si vous devez vous assurer qu'il a été appelé avec des arguments spécifiques, ajouter WithExactArguments(), comme ceci:

int? id = 10; 
string name = "David"; 

Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(...); 

espoir qui aide.

+0

Merci pour la réponse, mais je reçois une exception NullReferenceException avec cette solution. – hightow

+0

Où exactement? Pourriez-vous nous envoyer une trace de pile à [email protected]? –

1

Avis de non-responsabilité, je travaille dans Typemock.

Pour éviter des exceptions, vous devriez faux tous les futurs instatnces de MyDataContext:

var fakeDC = Isolate.Fake.AllInstances<MyDataContext>(); 

Et puis définir le comportement fo MyFunction():

int? id = 10; 
string name = "David"; 

Isolate.WhenCalled(() => fakeDC.MyFunction(id, name)).WithExactArguments().WillReturn(..); 

Il veille à ce que toutes les instances de MyDataContext seront faked (créé par le nouveau MyDataContext() dans n'importe quelle partie de votre programme), et le comportement de MyFunction() sera également truqué.

Comme je ne connais pas tous les détails, consultez l'exemple ci-dessous pour plus de compréhension:

internal class Foo 
{ 
    public Foo() 
    { 
    } 

    public int Bar() 
    { 
     var x = new MyDataContext(); 
     return x.MyFunction(null, "5"); 
    } 
} 

public class MyDataContext : DataContext 
{ 
    // 
    public int MyFunction(int? a, string b) 
    { 
     if(a == null) 
     { 
      throw new Exception(); 
     } 

     return 0; 
    } 
} 

[TestMethod, Isolated] 
public void TestMyDataContext() 
{ 
    //Arrange 
    var fakeDC = Isolate.Fake.AllInstances<MyDataContext>(); 
    Isolate.WhenCalled(() => fakeDC.MyFunction(null, "5")).WithExactArguments().WillReturn(6); 

    //Act 
    var foo = new Foo(); 
    var res = foo.Bar(); 

    //Assert 
    Assert.AreEqual(6, res); 
} 

Voir toutes les informations dans notre docs.

Questions connexes