2010-07-08 94 views
2

我有一个网页,根据不同的条件显示不同的消息。 我想单元测试这个,所以我配置我的项目使用MVVM,我正在测试我的ViewModel。单元测试消息

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

现在我这样做:

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

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

我怎样才能以优雅的方式测试这个?谢谢!

+1

你甚至可以给一个示例代码片段 - 它可以保证让您的答案更好 – 2010-07-08 14:07:01

回答

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)); 
    } 
} 

这样我可以检查我的消息“喜RIC”必须符合“喜{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."); 
} 

现在,您的视图模型可以执行其逻辑并返回StatusMessages之一:

public class SomeViewModel 
{ 
    ... 

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

    ... 
} 

在您的测试:

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

这很好,但我已经在使用资源文件(请参阅我的更新问题)。问题是我正在使用动态字符串... – Ricibald 2010-07-08 14:55:52

+0

@Ricibald - 在单元测试中可能有点冒险,但是您可以使用正则表达式或'string.Contains()'来验证消息。 – Jay 2010-07-08 17:11:44

1

我将与您正在做什么去或可能是@Jay建议的。

但是,我真的当你说不懂,

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

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

+0

好的,但以这种方式,似乎我重复了底层的实现。我想将我的课程测试为黑盒子 – Ricibald 2010-07-08 15:12:54

+0

如果您的代码中有逻辑,而不是预期的字符串,那么您将重复实现。当我说你应该设置一个场景时,这意味着你只需设置某些变量。 – 2010-07-09 00:26:11