2010-11-06 13 views
2

Je souhaite vérifier qu'une chaîne est définie sur une valeur spécifique dans un objet Moq. J'ai créé une petite application console pour simuler ce que je veux faire.Comment puis-je ignorer l'espace blanc dans une expression Moq VerifySet()?

using System; 
using Moq; 

namespace MoqVerifySet 
{ 
    public interface MyInterface 
    { 
     string MyValue { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Mock<MyInterface> mockMyInterface = new Mock<MyInterface>(); 
      var myI = mockMyInterface.Object; 
      myI.MyValue = @"hello 
          world. 
          Please ignore 
          the whitespace"; 

      try 
      { 
       mockMyInterface.VerifySet(i => i.MyValue = "hello world. Please ignore the whitespace"); 
       Console.WriteLine("Success"); 
      } 
      catch(Exception ex) 
      { 
       Console.WriteLine("Error : {0}", ex.Message); 
      } 

      Console.WriteLine("\n\nPress any key to exit..."); 
      Console.ReadKey(); 
     } 
    } 
} 

Alors, je pensais que je pouvais créer une petite méthode

public static string PrepSqlForComparison(string sql) 
{ 
    Regex re = new Regex(@"\s+"); 
    return re.Replace(sql, " ").Trim().ToLower(); 
} 

Et changer

mockMyInterface.VerifySet(i => i.MyValue = "hello world. Please ignore the whitespace"); 

à

mockMyInterface.VerifySet(i => PrepSqlForComparison(i.MyValue) = "hello world. Please ignore the whitespace"); 

Mais cela ne compile pas depuis le opérateur dans l'expression est un âne ignement, pas un égal.

Donc, si je ne peux pas le faire de cette façon, comment puis-je vérifier tout en ignorant les cas, les espaces et autres formats?

Répondre

4

Si vous n'avez pas besoin de la fonctionnalité de VerifySet (si vous ne vous préoccupez la dernière valeur de consigne), vous pourriez installer la propriété MyValue dans votre objet fantaisie simplement Retransmet la dernière valeur de consigne en appelant:

mockMyInterface.SetupProperty(f => f.MyValue); 

Ensuite, vous pouvez effectuer une vérification de comparaison/égalité qui ignore les espaces blancs et les sauts de ligne. J'ai créé un StringComparer personnalisé pour résumer cette logique dans mon test:

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Moq; 

namespace MoqVerifySet 
{ 
public interface MyInterface 
{ 
    string MyValue { get; set; } 
} 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var mockMyInterface = new Mock<MyInterface>(); 
     mockMyInterface.SetupProperty(f => f.MyValue); 

     MyInterface myI = mockMyInterface.Object; 
     myI.MyValue = @"hello 
         world. 
         Please ignore 
         the whitespace"; 
     try 
     { 
      var comparer = new CompareWithoutWhitespace(StringComparison.CurrentCultureIgnoreCase); 
      Assert.IsTrue(comparer.Equals(myI.MyValue, "hello world. Please ignore the whitespace")); 
      Console.WriteLine("Success"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Error : {0}", ex.Message); 
     } 

     Console.WriteLine("\n\nPress any key to exit..."); 
     Console.ReadKey(); 
    } 
} 

internal class CompareWithoutWhitespace : StringComparer 
{ 
    private readonly StringComparison _stringComparison; 

    public CompareWithoutWhitespace(StringComparison stringComparison) 
    { 
     _stringComparison = stringComparison; 
    } 

    public override int Compare(string x, string y) 
    { 
     return String.Compare(RemoveWhitespace(x), RemoveWhitespace(y), _stringComparison); 
    } 

    public override bool Equals(string x, string y) 
    { 
     return String.Equals(RemoveWhitespace(x), RemoveWhitespace(y), _stringComparison); 
    } 

    public override int GetHashCode(string obj) 
    { 
     return RemoveWhitespace(obj).GetHashCode(); 
    } 

    private static string RemoveWhitespace(string input) 
    { 
     if (string.IsNullOrEmpty(input)) return input; 
     input = input.Replace(Environment.NewLine, ""); 
     return input.Replace(" ", ""); 
    } 
} 
} 
+0

Merci. C'est exactement ce que je cherchais. +1 –

1

Votre problème est des espaces rien à voir avec Mock, Votre myI.MyValue utilise un verbatim string literal.

La ligne:

myI.MyValue = @"hello world. 
       Please ignore 
       the whitespace"; 

Avis tous les espaces à gauche de la première lettre des deux dernières lignes. Est équivalent à écrire:

myI.MyValue = @"hello world.       Please ignore       the whitespace";