2017-10-19 12 views
2

J'essaie de résoudre le diamond kata afin d'apprendre à écrire des tests basés sur la propriété avec la bibliothèque fscheck. Je veux écrire les tests avec C# et j'utilise Visual Studio 2017.C#, xunit, fscheck, écrire un simple test basé sur la propriété en utilisant un générateur personnalisé ou une chaîne aléatoire contrainte

Je veux écrire un test basé sur une propriété qui ne génère pas de caractères aléatoires en entrée, mais seulement des lettres. Je ne sais pas comment écrire le générateur fscheck nécessite de le faire et dans quel fichier mettre le code? J'ai cherché partout et lu la documentation, mais j'ai des problèmes (en partie parce que je ne peux pas très bien traduire F # en C#).

Comment [Property] est-il utilisé pour contraindre les données d'entrée uniquement aux lettres?

S'il y a une meilleure approche s'il vous plaît faites le moi savoir.

[Edit:]

Je modifié mes exemples de code, qui contiennent maintenant une solution de travail par Kurt Schelfthout.



Tests

using DiamondKata; 
using FsCheck; 
using FsCheck.Xunit; 
using Xunit; 

namespace DiamondKataTests 
{ 
    public static class Arbitraries 
    { 
     private static readonly string upperAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     private static readonly string lowerAlphabet = ""; //upperAlphabet.ToLower(); 
     private static readonly char[] wholeAlphabet = (lowerAlphabet + upperAlphabet).ToCharArray(); 
     public static Arbitrary<char> LetterGenerator() 
     { 
      return Gen.Elements(wholeAlphabet).ToArbitrary(); 
     } 
    } 

    public class DiamondKataTests 
    { 
     // THIS WORKS and is apparently the preferred way of doing things 
     // also see here: https://stackoverflow.com/questions/32811322/fscheck-in-c-generate-a-list-of-two-dimension-arrays-with-the-same-shape 
     [Property()] 
     public Property shouldReturnStringAssumesValidCharWasProvided() 
     { 
      return Prop.ForAll(Arbitraries.LetterGenerator(), letter => 

       // test here 
       Assert.NotNull(Diamond.Create(letter)) 
      ); 
     } 

     // Second solution ... 
     // Error here: Arbitraries is a type not valid in the given context 
     [Property(Arbitrary = new[] { typeof<Arbitraries> })] 
     public void testThatAssumesValidCharWasProvided(char lettersOnlyHERE) 
     { 
      // ? 
     } 
    } 
} 

classe Pour tester

namespace DiamondKata 
{ 
    public class Diamond 
    { 
     public static string Create(char turningPointCharacter) 
     { 
      return ""; 
     } 
    } 
} 

Répondre

0

Vous ne pouvez pas imposer des contraintes dans un ttributes, les types que vous pouvez passer à un attribut sont juste limités à le faire.

Vous avez quelques options. Vous pouvez définir une instance personnalisée Arbitrary pour char, c'est-à-dire une implémentation de Arbitrary<char> et configurer la propriété pour l'utiliser.

public static class Arbitraries 
{ 
    public static Arbitrary<char> LetterGenerator() 
    { 
     return Gen.Elements(wholeAlphabet).ToArbitrary(); 
    } 
} 

public class DiamondKataTestClass1 
{ 
    [Property(Arbitrary=new[] { typeof<Arbitraries> })] 
    public void testThatAssumesValidCharWasProvided(char lettersOnlyHERE) 
    { 
     // ? 
    } 
} 

Vous pouvez également utiliser l'API plus flexible pour personnaliser la ligne du générateur:

public class DiamondKataTestClass1 
{ 
    [Property()] 
    public Property testThatAssumesValidCharWasProvided() 
    { 
     Prop.ForAll(Arbitraries.LetterGenerator()) (letter => 
     // test here 
     ) 
    } 
} 
+0

merci beaucoup pour votre réponse, malheureusement vos solutions me donner des erreurs. J'ai édité le message ci-dessus qui inclut maintenant votre code et commentaires où j'obtiens des erreurs ... merci! – Shakka

+0

trouvé le correctif pour l'une des erreurs moi-même, votre syntaxe était légèrement éteint, j'ai pris la liberté et édité votre solution, merci encore! – Shakka