gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:01:38 25 4
gpt4 key购买 nike

有没有办法创建一个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();

接口(interface) -->

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;

最佳答案

是的,你可以,前提是你同时使用 CallBase调用具体类,As<>以适当的接口(interface)/基类为目标:

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 特定 - 请注意,类接口(interface)的默认实现是 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();

关于c# - 有没有办法创建一个模拟对象,只模拟一个属性,让其他人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27500563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com