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)
您可以尝试将测试编写为异步.考虑这个测试方法:
[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)
| 归档时间: |
|
| 查看次数: |
14605 次 |
| 最近记录: |