我有一个网页,根据不同的条件显示不同的消息。 我想对其进行单元测试,因此我将项目配置为使用MVVM并且我正在测试我的ViewModel。
我的ViewModel现在格式化不同的消息。我该怎么测试呢?我不想重现所有的字符串,看起来很脏...
现在我正在这样做:
void test()
{
string message = _viewModel.DoWork();
Assert.AreEqual(message, Resource.MyResourceText);
}
但这是一个简单的案例。现在我有包含系统日期和其他变量的动态字符串。
如何以优雅的方式测试?谢谢!
答案 0 :(得分:2)
如果您的问题只是在测试设备中复制字符串,请将它们全部放在enum
或class
中。
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}”