2

次の文字列があります。

       Actual       |   Expected
"The Actual String" | "The"
                    | "Actual"
                    | "String"
                    | "Other string"
                    |    ...

Assert次のように、文字列のいずれかがExpected実際の文字列に含まれるようにするメソッドを作成する必要があります。

[TestClass]
public class UnitTest
{
    [TestMethod]
    public void TestMethod()
    {
        //Assertion Passed
        AssertContainsString("The Actual String", "The"); 

        //Assertion Passed
        AssertContainsString("The Actual String", "Something", "Actual"); 

        //Assertion Failed
        AssertContainsString("The Actual String", "Something", "Something Else"); 
    }

    public void AssertContainsString(string actual, params string[] expected)
    {

    }
}

方法を試しましたCollectionAssert.Containsがうまくいきませんでした。文字列を繰り返し処理せずに使用できる簡単な方法はありexpectedますか?

4

4 に答える 4

1

あなたがした場合

if (actual.Split(' ').Contains(expected)) return true;

しかし、期待されるものを繰り返す必要があると思います

foreach (string ex in expected)
{
    if (actual.Split(' ').Contains(ex)) return true;
}

Gene Sのコメントに従って編集

expected.Any(ex => actual.Split(' ').Contains(ex))

必要に応じて砂糖を使用しますが、プロセッサの節約はありません。読みにくくなるだけです。

于 2012-06-13T12:02:40.493 に答える
1

文字列クラスの拡張メソッド?

    public static bool AnyIn(this string s, params string[] values)
    {
        return values.Any(x => s.Contains(x));
    }

この方法で呼び出し可能:

    string test = "The actual string";
    if(test.AnyIn("The") == true)   // success
    ...
    if(test.AnyIn("The", "actual", "string") == true)   // success
    ...
    if(test.AnyIn("The", "actual", "value") == true)   // success
    ...
    if(test.AnyIn("some", "value") == true)   // fail

またはまた

    System.Diagnostics.Debug.Assert(test.AnyIn("some", "value"), "No expected string found"); // fail

もちろん、静的クラス内に拡張メソッドを配置します
Visual Studio 2010コンソールアプリケーションでも試しました

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            string test = "The actual string";

            // Prints False
            bool result = test.AnyIn("other", "value");
            Console.WriteLine(result.ToString()); 

            // Prints True
            result = test.AnyIn("other", "The");
            Console.WriteLine(result.ToString()); 

            //  No Assert dialog here 
            System.Diagnostics.Debug.Assert(test.AnyIn("other", "The"), "No expected values found");

            //  Big Assert dialog here with message "No expected values found"
            System.Diagnostics.Debug.Assert(test.AnyIn("other", "The"), "No expected values found");

        }

    }

    static class ext
    {
        public static bool AnyIn(this string s, params string[] values)
        {
            return values.Any(x => s.Contains(x));
        }
    }
}

編集:

大文字と小文字が異なる問題は、このように拡張子を変更することで解決できます

public static bool AllIn(this string s, params string[] values)     
{         
     return values.Any(x => s.IndexOf(x + " ", StringComparison.CurrentCultureIgnoreCase) >= 0);     
}

ただし、予想される文字列の 1 つが実際の文字列内に埋め込まれている場合の誤検知を防ぐには、実際の文字列の末尾にスペースを追加する必要があります。

string test = "The actual string ";  // notice the extra space added at the end
于 2012-06-13T11:59:17.823 に答える
1

期待される配列のすべての値が実際の変数で見つかった場合、true を返します。

bool foundall = expected.Except(actual.Split(' ')).Count()==0;

実際の文字列に含まれる値が 1 つだけの場合でも true を返します。

bool ans = expected.Except(actual.Split(' ')).Count() != expected.Length;
于 2012-06-13T11:56:27.010 に答える