Как я могу игнорировать пробелы в выражении Moq VerifySet ()? - PullRequest
2 голосов
/ 06 ноября 2010

Я хочу убедиться, что для строки задано определенное значение в объекте Moq.

Я создал небольшое консольное приложение для имитации того, что я хочу сделать.

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();
        }
    }
}

Итак, я подумал, что смогу создать маленький метод

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

и изменить

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

до

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

Но это не компилируется, поскольку оператор в выражении является присваиванием, а не равенством.

Итак, если я не могу сделать это таким образом, как я могу проверить, игнорируя регистр, пробелы и другое форматирование?

Ответы [ 2 ]

4 голосов
/ 06 ноября 2010

Если вам не нужна функциональность VerifySet (если вас интересует только последнее установленное значение), вы можете настроить свойство MyValue в вашем фиктивном объекте, чтобы просто отображать последнее установленное значение, вызывая:

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

Тогда вы можете выполнить проверку сравнения / равенства, которая игнорирует пробелы и разрывы строк.Я создал собственный StringComparer для инкапсуляции этой логики в моем тесте:

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(" ", "");
    }
}
}
1 голос
/ 18 мая 2012

Ваша проблема с пробелами не имеет ничего общего с Mock, ваш myI.MyValue использует буквенный строковый литерал .

Строка:

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

Обратите внимание на все пробелы слева от первой буквы последних двух строк.Эквивалентно письму:

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