是的,标题完全说明了一切。
[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()方法。开溜。
答案 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>();