[使用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()
感谢先进的人!
答案 0 :(得分:7)
我怀疑这是问题所在:
return (new List<Abc>() { new Abc() }) as IQueryable<Abc>;
List<T>
未实现IQueryable<T>
,因此始终将返回null。请致电AsQueryable
进行转换:
return new List<Abc>().AsQueryable();
顺便说一句,在大多数情况下,这是一个偏好as
的演员阵容的理由:如果你刚刚演绎到IQueryable<Abc>
,你就会收到一个例外的线路造成这个问题。只有当{em>不是错误才能转换为“失败”时,才应使用as
。 as
运算符几乎总是后面都会进行无效性测试。
(请注意,此行为本身与模拟或Moq无关。这只是as
运算符的行为...)