单元测试消息

时间:2010-07-08 14:05:05

标签: c# unit-testing messages

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

我的ViewModel现在格式化不同的消息。我该怎么测试呢?我不想重现所有的字符串,看起来很脏...

现在我正在这样做:

void test() 
{
    string message = _viewModel.DoWork();
    Assert.AreEqual(message, Resource.MyResourceText);
}

但这是一个简单的案例。现在我有包含系统日期和其他变量的动态字符串。

如何以优雅的方式测试?谢谢!

3 个答案:

答案 0 :(得分:2)

如果您的问题只是在测试设备中复制字符串,请将它们全部放在enumclass中。

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可以执行其逻辑并返回StatusMessages之一:

public class SomeViewModel
{
    ...

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

    ...
}

在你的测试中:

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

答案 1 :(得分:1)

我会选择你正在做的事情,或者可能是@Jay建议的事情。

但是,当你说时,我真的不明白,

  

现在我有动态字符串包含   系统日期和其他变量。

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

答案 2 :(得分:1)

我以这种方式解决了:

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}”