是否有任何可能的方法来Moq对象的ToString方法

本文关键字:方法 Moq 对象 ToString 是否 任何可 | 更新日期: 2023-09-27 18:17:16

对,标题已经说明了一切。

[TestMethod()]
void TestFunc()
{
    string r = "Hello World"
    var oMoq = new Mock<object>();
    oMoq.setup(o => o.ToString()).Returns(r);
    Assert.AreEqual(r, oMoq.Object.ToString());
}

使用Moq框架和VS2012 (express)附带的单元测试框架

忍者编辑,忘记包含问题…
有办法让这成为可能吗?

(我不完全确定上面的代码是否会编译,我的头没有访问VS2012 atm)


要更清楚地说明我的情况:

我有一个对象列表

var myList = new List<MyObj>();

我添加了两个MyObj模型:

var oMoq = new Mock<MyObj>();
oMoq.setup(o => o.ToString()).Returns(r);
myList.Add(oMoq.Object);
myList.Add(oMoq.Object);

然后使用

string.Join(",", myList);

我希望产生

Hello World,Hello World

但是它返回

MyNamespace.MyObjMoqThingProxy, MyNamespace.MyObjMoqThingProxy

使用

var o = new Mock<object>();
o.Setup(x => x.ToString()).Returns("Hello World");
Assert.AreEqual("Hello World", o.Object.ToString());

产率Castle.Proxies.ObjectProxy

public class Test
{
    override public string ToString()
    {
        return "myTClass";
    }
}
/* snip */
var o = new Mock<Test>();
o.Setup(x => x.ToString()).Returns("Hello World");
Assert.AreEqual("Hello World", o.Object.ToString());

产率Hello World

那么,回答我自己的第一个问题。我猜你不能模拟一个对象的ToString()方法,如果那个类没有重写ToString。然后,它(Moq)将使用自己的内部ToString()方法。家伙。

是否有任何可能的方法来Moq对象的ToString方法

我认为这将工作,因为Object.ToString()是一个虚拟的方法,Moq可以模拟。


试试string.Join(",", myList.Select(o=>o.ToString()));

一种方法是为对象提取一个接口,并在该接口上显式声明ToString()方法,然后模拟接口而不是类,这样设置就可以工作了

public interface IMyObj
{
    string ToString();
}
public class MyObj : IMyObj
...
var iMoq = new Mock<IMyObj>();
iMoq.setup(o => o.ToString()).Returns(r);
myList.Add(iMoq.Object);
myList.Add(iMoq.Object);
对实现代码的唯一更改是更改List的类型
var myList = new List<IMyObj>();