C# 单元测试消息

C# 单元测试消息,c#,unit-testing,messages,C#,Unit Testing,Messages,我有一个网页,根据不同的情况显示不同的消息。 我想对此进行单元测试,所以我将项目配置为使用MVVM,并且正在测试我的ViewModel 我的ViewModel现在可以格式化不同的消息。我如何测试这个?我不想复制所有的字符串,它看起来很脏 现在我要做的是: void test() { string message = _viewModel.DoWork(); Assert.AreEqual(message, Resource.MyResourceText); } 但这是一个简单

我有一个网页,根据不同的情况显示不同的消息。 我想对此进行单元测试,所以我将项目配置为使用MVVM,并且正在测试我的ViewModel

我的ViewModel现在可以格式化不同的消息。我如何测试这个?我不想复制所有的字符串,它看起来很脏

现在我要做的是:

void test() 
{
    string message = _viewModel.DoWork();
    Assert.AreEqual(message, Resource.MyResourceText);
}
但这是一个简单的例子。现在我有了包含系统日期和其他变量的动态字符串


我如何以优雅的方式来测试它?谢谢

如果您关心的只是在测试装置中复制字符串,请将它们全部放在
枚举

public static class StatusMessage 
{
    public static readonly string SavedSuccessfully
        = "Item was successfully saved.";
    public static readonly string DuplicateRecord
        = "This record is a duplicate.";
    public static readonly string SubscriptionExpired
        = "Your subscription has expired; please renew now.");
}
现在,viewmodel可以执行其逻辑并返回以下状态消息之一:

public class SomeViewModel
{
    ...

    public string Status
    {
        get { return StatusMessage.SavedSuccessfully; }
    }

    ...
}
在您的测试中:

Assert.AreEqual(StatusMessage.SavedSuccessfully, viewmodel.Status);

我会支持你目前正在做的事情,或者可能是@Jay建议的事情

但是,我真的不明白你说

现在我有了包含 系统日期和其他变量

所需字符串始终必须硬编码为,以便对其进行单元测试。永远不要在单元测试中使用任何计算。您应该设置一个场景(日期、任何其他变量),然后您就知道预期的字符串是什么。然后您将对其进行硬编码。
如果您想对不同的字符串使用相同的方法进行单元测试,可以在nunit中使用
TestCase
属性,或在MBUnit中使用
RowTest
属性。

I通过以下方式解决:

class MyTestClass
{
    void test() 
    {
        string message = _viewModel.DoWork();
        MyAssert.StringFormatConforms(message, Resource.MyResourceText);
    }
}

class MyAssert
{
    public static void StringFormatConforms(string stringToCheck, string format)
    {
        // replace {0}, {1} with .*
        string regex = "^" + Regex.Replace(format, "{[0-9]+}", ".*") + "$";
        bool conforms = Regex.IsMatch(stringToCheck, regex);
        if (!conforms)
            throw new AssertFailedException(String.Format("The string {0} does not conforms to format: {1}", stringToCheck, format));
    }
}

通过这种方式,我可以检查我的消息“hi ric”是否必须符合“hi{0}”

您甚至可以给出一个示例片段-它保证为您提供更好的答案这很好,但我已经在使用参考资料文件(请参阅我更新的问题)。问题是我使用的是动态字符串…@Ricibald——在单元测试中可能有点冒险,但您可以使用正则表达式或
string.Contains()
来验证消息。好的,但这样看来,我似乎在重复底层实现。我想将我的类作为一个黑盒进行测试,如果代码中有逻辑,而不是预期的字符串,那么您将重复实现。当我说你应该设置一个场景,这意味着你只是设置了一些变量。