C# 单元测试消息
我有一个网页,根据不同的情况显示不同的消息。 我想对此进行单元测试,所以我将项目配置为使用MVVM,并且正在测试我的ViewModel 我的ViewModel现在可以格式化不同的消息。我如何测试这个?我不想复制所有的字符串,它看起来很脏 现在我要做的是:C# 单元测试消息,c#,unit-testing,messages,C#,Unit Testing,Messages,我有一个网页,根据不同的情况显示不同的消息。 我想对此进行单元测试,所以我将项目配置为使用MVVM,并且正在测试我的ViewModel 我的ViewModel现在可以格式化不同的消息。我如何测试这个?我不想复制所有的字符串,它看起来很脏 现在我要做的是: void test() { string message = _viewModel.DoWork(); Assert.AreEqual(message, Resource.MyResourceText); } 但这是一个简单
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()
来验证消息。好的,但这样看来,我似乎在重复底层实现。我想将我的类作为一个黑盒进行测试,如果代码中有逻辑,而不是预期的字符串,那么您将重复实现。当我说你应该设置一个场景,这意味着你只是设置了一些变量。