有没有办法让Moq对象的ToString方法?

时间:2013-06-07 08:09:13

标签: c# moq

是的,标题完全说明了一切。

[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附带的单元测试框架(快速)

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

(我不完全确定上面的代码会完全编译,我的头脑无法访问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 somehwere。它(Moq)将使用自己的内部ToString()方法。开溜。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

执行此操作的一种方法是为对象提取接口并在该接口上显式声明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>();