[使用Moq]
我试图模拟一个具体的类,并模拟该类的虚拟方法"Get()"。当测试方法"GetItemsNotNull()"时,我总是得到返回的null,而不是模拟函数的返回。
这是代码
//SomeClasses.cs
namespace MoQExamples
{
public abstract class Entity
{
}
public class Abc : Entity
{
}
public interface IRepository<T> where T : Entity
{
IQueryable<T> Get();
}
public class Repository<T> : IRepository<T> where T : Entity
{
private readonly ISession _session;
public Repository()
{
_session = null;
}
public Repository(ISession session)
{
_session = session;
}
protected ISession CurrentSession
{
get { return _session; }
}
public virtual IQueryable<T> Get()
{
return CurrentSession.Query<T>();
}
}
public interface IAbcRepository
{
Abc GetItemsNotNull();
}
public class AbcRepository : Repository<Abc>, IAbcRepository
{
public Abc GetItemsNotNull()
{
return Get().FirstOrDefault(abc => abc !=null);
}
}
}
这是测试类
namespace MoQExamples
{
[TestFixture]
public class SomeClassesTest
{
private readonly Mock<AbcRepository> _abcRepositoryMock = new Mock<AbcRepository>(MockBehavior.Strict) { CallBase = true };
[SetUp]
public void SetupTest()
{
_abcRepositoryMock.Setup(x => x.Get()).Returns(Get);
}
public IQueryable<Abc> Get()
{
return (new List<Abc>() { new Abc() }) as IQueryable<Abc>;
}
[Test]
public void TestGetItemsNotNull()
{
Assert.IsNotNull(_abcRepositoryMock.Object.GetItemsNotNull());
}
}
}
断言alays失败。。而不是返回SomeClassesTest.Get()
感谢先遣队员!
我怀疑这就是问题所在:
return (new List<Abc>() { new Abc() }) as IQueryable<Abc>;
List<T>
不实现IQueryable<T>
,因此这将始终返回null。调用AsQueryable
将其转换为
return new List<Abc>().AsQueryable();
顺便说一句,这是在大多数情况下更喜欢强制转换而不是as
的原因:如果您只是强制转换为IQueryable<Abc>
,那么您会在真正导致问题的行中收到一个异常。只有当as
不是转换为"失败"的错误时,才应该使用它。as
运算符应该几乎总是后面跟着零性测试。
(注意,这种行为本身与mocking或Moq无关。它只是as
运算符的行为…)