1

没错,标题就说明了一切。

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

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

忍者编辑,忘了包括问题......
有没有办法让这成为可能?

(我不完全确定上面的代码是否会编译,我的头顶是否无法访问 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);

我希望生产的

你好世界,你好世界

但相反,它返回了

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() 方法。然后它(起订量)将使用自己的内部 ToString() 方法。臭虫。

4

2 回答 2

2

我认为这会起作用,因为这Object.ToString()是 Moq 可以模拟的虚拟方法。

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

于 2013-06-07T08:13:54.557 回答
-1

一种方法是为您的对象提取接口并在该接口上显式声明 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>();
于 2016-07-27T07:58:55.353 回答