C# 如何测试具有绑定属性的类

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

我试图为下面的代码编写一个单元测试,专门测试ModelUnderTest类的Calculate方法。尽管做了几次尝试,我还是被难住了

问题的关键在于,模型使用了绑定到另一个类的属性的属性(该属性在我的实际代码中也被绑定,这里没有显示)。该属性在这两个类中都是只读的,所以我不能只设置它

我想模拟(或存根)IService类,但我开始怀疑在这种情况下这是否可行

代码如下:

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
之间存在紧密耦合。打破这种紧密联系是你的第一步。