单元测试Viewmodel

Hou*_*man 12 .net c# silverlight tdd unit-testing

我是TDD的新手.我已经开始在视图模型上创建我需要的属性作为普通的自动属性.

public string Firstname { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个测试

[TestMethod]
[Tag("Property")]
public void FirstNameTest()
{
    ViewModel = new CustomerViewModel();
    ViewModel.PropertyChanged += (s, e) =>
                                     {
                                         Assert.AreEqual("Firstname", e.PropertyName);
                                         Assert.AreEqual("Test", ViewModel.Firstname);
                                     };
    ViewModel.Firstname = "Test";
}
Run Code Online (Sandbox Code Playgroud)

然后我会扩展实际的实现,使测试通过这样:

public string Firstname
{
    get { return _contact.FirstName; }
    set
    {
        if (_contact.FirstName == value)
            return;

        _contact.FirstName = value;

        RaisePropertyChanged(() => Firstname);
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是测试仍然传递给Aut属性.任何提示,如何我可以改善我的过程?

BFr*_*ree 10

你可以这样做:

    [TestMethod]
    [Tag("Property")]
    public void FirstNameTest()
    {
        bool didFire = false;
        ViewModel = new CustomerViewModel();
        ViewModel.PropertyChanged += (s, e) =>
                                         {
                                             didFire = true;
                                             Assert.AreEqual("Firstname", e.PropertyName);
                                             Assert.AreEqual("Test", ViewModel.Firstname);
                                         };
        ViewModel.Firstname = "Test";
        Assert.IsTrue(didFire);
    }
Run Code Online (Sandbox Code Playgroud)


ava*_*nek 7

您可以尝试将测试编写为异步.考虑这个测试方法:

[TestMethod]
[Asynchronous]
public void TestMethod1()
{
    TestViewModel testViewModel = new TestViewModel();

    bool firstNameChanged = false;

    testViewModel.PropertyChanged +=
        (s, e) =>
            {
                if (e.PropertyName == "FirstName")
                {
                    firstNameChanged = true;
                }
            };

    EnqueueCallback(() => testViewModel.FirstName = "first name");
    EnqueueConditional(() => firstNameChanged == true);
    EnqueueTestComplete();
}
Run Code Online (Sandbox Code Playgroud)

请注意方法顶部的Asynchronous属性.这里有两个重要的方法:EnqueueCallback和EnqueueTestComplete.EnqueueCallback会将lambda表达式添加到队列中,测试方法将等待直到执行当前回调.在这种情况下,我们在ViewModel上订阅PropertyChanged事件,当FirstName属性通知更改时,我们将本地布尔变量设置为true.然后我们排队两个回调:一个用于设置FirstName属性,另一个用于断言本地布尔变量已更改值.最后,我们需要添加对EnqueueTestComplete()的调用,以便框架知道测试结束了.

注意:为了获得EnqueueCallback和EnqueueTestComplete,您需要在测试类上继承SilverlightTest.您还需要导入Microsoft.Silverlight.Testing以获取Asynchronous属性.它应该看起来像这样:

using Microsoft.Silverlight.Testing;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Foo.Example.Test
{
    [TestClass]
    public class Tests : SilverlightTest
    {

        // ... tests go here
    }
}
Run Code Online (Sandbox Code Playgroud)