// IsExist总是假的,这是一个错误吗?
[TestMethod]
public void IsExist()
{
private Mock<IRepository> repository = new Mock<IRepository>();
Foo f = new Foo();
repository.Expect(s => s.IsExist(foo)).Returns(true);
var controller = new MyController(repository.Object);
var result = (ViewResult)controller.DoSometing();
}
public class MyController : Controller
{
IRepository _repository ;
public MyController(IRepository repository)
{
_repository = repository;
}
public ViewResult DoSometing()
{
bool IsExist = _repository.IsExist(new Foo());
//IsExist always false,is it a bug?
return View(foo);
}
}
答案 0 :(得分:1)
首先,您使用的是哪个模拟库(答案可能会因此而改变)?
我知道如果你使用的是Rhino Mocks,问题就是当你收到你在顶部创建的foo
特定实例时,你的期望被设置为返回true。这是在控制器中执行时传递的内容的不同实例,因此返回false(因为没有针对 foo
对象的版本设置的期望)。更清楚的是,如果你有这个代码:
Foo f1 = new Foo();
Foo f2 = new Foo();
repository.Expect(s => s.IsExist(f1)).Returns(true);
bool b1 = repository.Object.IsExist(f1);
bool b2 = repository.Object.IsExist(f2);
我希望b1
是真的(因为这是您设置的具体期望,即给定f1
返回true
)并且b2
将是假的(因为如果收到f2
,你没有告诉存储库做任何具体的事情,所以它会回归到返回false的默认行为。
在Rhino Mocks中,您需要设置这样的期望:
repository.Expect(s => s.IsExist(Arg<Foo>.Is.TypeOf)).Returns(true);
如果使用 Foo对象的任何实例调用IsExist,则返回true。如果您需要更具体,可以使用以下内容:
repository.Expect(s => s.IsExist(f => f.SomeProperty == "blah" && f.OtherProperty.StartsWith("baz")))).Returns(true);
如果foo.SomeProperty
等于"blah"
且foo.OtherProperty
以"baz"
开头,则返回true。
看起来你没有使用Rhino Mocks,因为你的语法有点不同,但希望能指出你正确的方向......
答案 1 :(得分:0)
在检查对象属性是否存在之前,使用某些值初始化对象属性。
public ViewResult DoSometing()
{
Foo obj = new Foo();
obj.Property1 = "some value";
bool IsExist = _repository.IsExist(obj);
//IsExist always false,is it a bug?
return View(foo);
}