是否有任何可能的方法来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()方法。家伙。
我认为这将工作,因为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>();