有没有办法创建一个模拟对象,只模拟其中一个属性,并让其他人

Ahm*_*saf 1 c# tdd moq

有没有办法创建一个模拟对象,只模拟其中一个属性,让其他(属性和方法)链接到原始类,而不必模拟所有方法

测试方法 - >

var test= new Mock<Test>().As<ITest>();
test.CallBase = true;
test.SetupGet(m => m.DateNow).Returns(DateTime.Now.AddDays(10));
double num= test.Object.Calc();
Run Code Online (Sandbox Code Playgroud)

界面 - >

public interface ITest
{
double Calc();
DateTime DateNow { get; }
}
Run Code Online (Sandbox Code Playgroud)

班级 - >

public class Test : ITest
{
 public DateTime DateNow
        {
            get
            {
                return DateTime.Now.Date;
            }
        }
public double Calc(){
DateTime d = DateTime.Now.AddDays(100);
return (DateNow - d).TotalDays;
}
Run Code Online (Sandbox Code Playgroud)

总是num = 0.0;

Stu*_*tLC 5

是的,您可以,只要您确实使用它们CallBase来调用具体类,并As<>定位适当的接口/基类:

var mockClass = new Mock<MyClass>().As<IMyInterface>();
mockClass.CallBase = true;
mockClass.SetupGet(m => m.Property1).Returns("Mock");

Assert.AreEqual("Mock", mockClass.Object.Property1);
Assert.AreEqual("MyClass", mockClass.Object.Property2);
Run Code Online (Sandbox Code Playgroud)

在这组实体上测试:

public interface IMyInterface
{
    string Property1 { get; set; }
    string Property2 { get; set; }
}

public class MyClass : IMyInterface
{

    public string Property1
    {
        get { return "MyClass"; }
        set {  }
    }

    public string Property2
    {
        get { return "MyClass"; }
        set { }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

为什么我的具体类不能多态调用Mocked重写属性?

这不是Moq特有的 - 请注意,类的接口的默认实现是密封的.如果您打算对类属性进行多态行为,则需要实现该属性virtual,如下所示:

public interface ITest
{
    DateTime DateNow { get; set; }
    double Calc();
}

public class Test : ITest
{
    public virtual DateTime DateNow // ** NB : Virtual
    { // ....
Run Code Online (Sandbox Code Playgroud)

编辑

这应该让它更清晰 - 尝试使用和不使用虚拟关键字DateNow:

var test = new Mock<Test>().As<ITest>();
test.CallBase = true;
test.SetupGet(m => m.DateNow).Throws(new NotImplementedException());
double num = test.Object.Calc();
Run Code Online (Sandbox Code Playgroud)