2017-10-20 15 views
2

En C# je peux déclarer des variables non initialisées qui sont ensuite assignées à diverses méthodes de la classe. Par exemple, dans un test NUnit, je peux déclarer une variable typée qui est seulement initialisée dans une méthode d'installation et ensuite utilisée de façon répétée dans les différents tests.Quel est le F idiomatique équivalent à la déclaration d'une variable pour une utilisation ultérieure en C#

private MyTestClass sut; 

public Setup() 
{ 
    sut = new MyTestClass(); 
    etc. 
} 

public FirstTest() 
{ 
    sut.DoSomeWork(1); 
} 

public SecondTest() 
{ 
    sut.DoSomeWork(2); 
} 

Je voudrais faire l'équivalent en F #. Cependant, selon this et d'autres, les «variables» non attribuées ne sont simplement pas les choses faites dans F #.

Dans le cas de mes tests F #, les tests ne reposent sur aucun type, juste au sein d'un module, donc [<DefaultValue>] val ne fonctionnera pas. L'utilisation de mutable ne semble pas juste, car cela semble être l'option de dernier recours pour les codeurs F #.

Puisque F # idomatique ne devrait pas nécessiter de valeurs non assignées, quelle est la façon "correcte" de contourner ce problème?

+0

Quel est le problème avec 'let sut = new MyTestClass()'? – s952163

+0

Pourquoi avez-vous besoin de ces variables? Y at-il une raison pour laquelle vous ne pouvez pas les déclarer là où vous les utilisez? Dans votre exemple C#, les deux tests ne peuvent pas être exécutés en parallèle, vous vous êtes tiré dans le pied. –

+0

Sûrement je ne devrais pas avoir à déclarer les variables chaque fois que je l'utilise. Si chaque test nécessite une instance de cette classe qui est initialisée de manière identique, cette initialisation doit être dans la configuration. Que feriez-vous si vous aviez un grand nombre de tests et que chaque test nécessitait une initialisation complexe de diverses classes auxiliaires. Vous ne voudriez pas avoir à faire cela dans chaque test. Vous l'utiliseriez dans un assistant qui s'exécuterait avant chaque test pour initialiser, c'est-à-dire la méthode d'installation. Ai-je mal compris quelque chose? – FSharpOrBust

Répondre

5

Vous pouvez utiliser des fonctions et des valeurs. Il n'est pas nécessaire de déclarer des variables non attribuées.

let makeTestClass() = 
    MyTestClass() 
    // etc. 

let ``First test``() = 
    let sut = makeTestClass() 
    sut.DoSomeWork() 

let ``Second test``() = 
    let sut = makeTestClass() 
    sut.DoSomeWork() 
+0

Je ne vois pas comment cela s'inscrit dans le contexte d'avoir une méthode d'installation?Cela permet de déclarer et d'initialiser dans chaque test (comme suggéré par Fyodor, ci-dessus) pour appeler une méthode pour retourner la classe de test. Si c'est la façon standard de faire les choses en F #, alors je vais avec ça, mais je ne peux pas m'empêcher de penser que je manque un truc ici. – FSharpOrBust

+0

Je dis ne pas utiliser une méthode d'installation. C'est F # idiomatique. C'est simple et cela permet aux tests de fonctionner en parallèle. – TheQuickBrownFox

1

Vous pouvez utiliser lazy:

let sut = lazy (new MyTestClass()) 

lazy reporte l'exécution d'une expression jusqu'à ce que le résultat est nécessaire. Les demandes suivantes pour la valeur paresseuse ne nécessitent pas d'être recalculé, il retourne simplement le résultat stocké de la dernière fois.

Ensuite, vous pouvez faire:

let ``First test``() = 
    sut.Force().DoSomeWork(1) 

let ``Second test``() = 
    sut.Force().DoSomeWork(2) 

Cela pourrait être approprié si l'initialisation est cher et vous ne souhaitez pas le répéter.