有没有办法创建一个模拟对象,只模拟其中一个属性,让其他(属性和方法)链接到原始类,而不必模拟所有方法
测试方法 - >
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;
是的,您可以,只要您确实使用它们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)
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |