C# 如何测试具有绑定属性的类
我试图为下面的代码编写一个单元测试,专门测试ModelUnderTest类的Calculate方法。尽管做了几次尝试,我还是被难住了 问题的关键在于,模型使用了绑定到另一个类的属性的属性(该属性在我的实际代码中也被绑定,这里没有显示)。该属性在这两个类中都是只读的,所以我不能只设置它 我想模拟(或存根)IService类,但我开始怀疑在这种情况下这是否可行 代码如下:C# 如何测试具有绑定属性的类,c#,unit-testing,mocking,dependency-properties,C#,Unit Testing,Mocking,Dependency Properties,我试图为下面的代码编写一个单元测试,专门测试ModelUnderTest类的Calculate方法。尽管做了几次尝试,我还是被难住了 问题的关键在于,模型使用了绑定到另一个类的属性的属性(该属性在我的实际代码中也被绑定,这里没有显示)。该属性在这两个类中都是只读的,所以我不能只设置它 我想模拟(或存根)IService类,但我开始怀疑在这种情况下这是否可行 代码如下: using System.Windows; using System.Windows.Data; namespace Test
using System.Windows;
using System.Windows.Data;
namespace Testing
{
public interface IService
{
int Option { get; }
}
public class ConcreteService : DependencyObject
{
public static readonly DependencyProperty ActiveOptionProperty = DependencyProperty.Register("ActiveOption", typeof(int), typeof(ConcreteService), new PropertyMetadata(null));
public int ActiveOption { get { return (int) GetValue(ActiveOptionProperty); } }
}
public class ModelUnderTest : DependencyObject
{
private readonly IService _service;
public ModelUnderTest(IService service)
{
_service = service;
BindingOperations.SetBinding(this,
CurrentOptionProperty,
new Binding
{
Source = _service,
Path = new PropertyPath(ConcreteService.ActiveOptionProperty)
});
}
public static readonly DependencyProperty CurrentOptionProperty = DependencyProperty.Register("Option", typeof(IService), typeof(ModelUnderTest), new PropertyMetadata(null));
public int Option
{
get { return (int)GetValue(CurrentOptionProperty); }
}
public int Calculate()
{
return Option + 7;
}
}
如果我有这样的测试:
[TestClass]
public class ModelUnderTestTest
{
[TestMethod]
public void Calculate_Test()
{
var service = MockRepository.GenerateStub<IService>();
var target = new ModelUnderTest(service);
// Do something to make target's Option value be '3'
target.Calculate().Should().Be(10);
}
}
[TestClass]
公共类ModelUnderTest
{
[测试方法]
公共空间计算_测试()
{
var service=MockRepository.GenerateStub();
var目标=测试中的新模型(服务);
//采取措施使目标公司的期权价值为“3”
target.Calculate()应()为(10);
}
}
如何使此测试通过?您可以为单元测试的IOC容器使用不同的配置。这里的基本问题是,
ConcreteService
和ModelUnderTest
之间存在紧密耦合。打破这种紧密联系是你的第一步。