【问题标题】:Is there a way to create a mock object and only mock one of the Property, and let the others有没有办法创建一个模拟对象,只模拟一个属性,让其他的
【发布时间】:2014-12-16 08:40:11
【问题描述】:

有没有办法创建一个mock对象,只mock一个Property,让其他的(Properties和Methods)链接到原来的类,而不用mock所有的方法

测试方法 -->

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();

接口 -->

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

类 -->

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;
}

总是 num = 0.0;

【问题讨论】:

  • 你不能只创建一个继承自真实类的新类,然后覆盖单个属性吗?
  • @pwas : 这样做会使架构复杂化,这仅用于测试目的。

标签: c# tdd moq


【解决方案1】:

是的,您可以,前提是您确实使用CallBase 调用具体类,并使用As&lt;&gt; 定位适当的接口/基类:

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);

在这组实体上进行测试:

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 { }
    }
}

编辑

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

这并不是真正的 Moq 特定 - 请注意,类的接口的默认实现是 sealed。如果您打算对类属性进行多态行为,则需要将该属性实现为virtual,如下所示:

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

public class Test : ITest
{
    public virtual DateTime DateNow // ** NB : Virtual
    { // ....

编辑

这应该更清楚 - 尝试在 DateNow 上使用和不使用 virtual 关键字:

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

【讨论】:

  • 我做了上面的解决方案,但它不起作用返回是 0.0,例外的是 -1
  • 请使用您的代码编辑您的帖子。我猜你在基类上没有基接口或虚拟属性?如果是这样,请注意这些不能是最小起订量。你需要 Moles / Fakes / Typemock 来做到这一点。
  • 我有接口并且没有虚拟属性但是我正在模拟一个属性并根据 Mock.Object.Calc() 中的该属性调用方法;​​
  • 我已将虚拟添加到属性中,但没有效果。
  • 具体类返回~-100,Mocked属性返回-90?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 2015-09-19
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多