- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 MVC 应用程序(EF6、SQL Server CE 4),我最近对其进行了重构以添加 UnitOfWork
类和一个服务层(这样我可以为每个请求使用一个 DbContext
,并成功进行事务)。
以前,我使用 Unity 将存储库注入(inject) Controller 。我的单元测试(针对 Controller )很容易设置——我只是模拟了每个存储库,并将它们传递给 Controller 构造函数。
重构后,我现在使用 Unity 注入(inject)服务层(到 Controller )和 UnitOfWork
(进入服务层)。服务层现在实例化每个存储库,通过传递 UnitOfWork.DbContext
到存储库的构造函数。
在我的单元测试中,我试图模拟 UnitOfWork
, 和 ServiceLayer(并将模拟的 UnitOfWork
对象传递给 ServiceLayer 的构造函数)。但是,测试失败,说“TestFixtureSetup 在 ControllerTest 中失败”。
我认为这是由于我试图通过 UnitOfWork
模拟到 ServiceLayer 模拟中,因此将不胜感激有关如何正确执行此操作的任何指导。
下面的相关代码片段。
工作单位
public interface IUnitOfWork:IDisposable
{
void Save();
IDSMContext Context { get; }
}
public class UnitOfWork : IUnitOfWork, IDisposable
{
private IDSMContext _context;
public UnitOfWork()
{
_context = new IDSMContext();
}
public IDSMContext Context
{
get {return _context;}
}
public void Save()
{
_context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
_context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
public interface IService
{
// Repositories
IUserRepository Users { get; }
IUserTeamRepository UserTeams { get; }
IPlayerRepository Players { get; }
IGameRepository Games { get; }
IUserTeam_PlayerRepository UserTeamPlayers { get; }
void Save();
}
public class Service: IService, IDisposable
{
private IUnitOfWork _unitOfWork;
private IUserRepository _userRepository;
private IUserTeamRepository _userTeamRepository;
private IPlayerRepository _playerRepository;
private IGameRepository _gameRepository;
private IUserTeam_PlayerRepository _userTeamPlayerRepository;
public Service(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
initialiseRepos();
}
private void initialiseRepos(){
_userRepository = _userRepository ?? new UserRepository(_unitOfWork.Context);
_userTeamRepository = _userTeamRepository ?? new UserTeamRepository(_unitOfWork.Context);
_playerRepository = _playerRepository ?? new PlayerRepository(_unitOfWork.Context);
_gameRepository = _gameRepository ?? new GameRepository(_unitOfWork.Context);
_userTeamPlayerRepository = _userTeamPlayerRepository ?? new UserTeam_PlayerRepository(_unitOfWork.Context);
}
public IUserRepository Users { get { return _userRepository; } }
public IUserTeamRepository UserTeams { get { return _userTeamRepository; } }
public IPlayerRepository Players { get { return _playerRepository; } }
public IGameRepository Games { get { return _gameRepository; } }
public IUserTeam_PlayerRepository UserTeamPlayers { get { return _userTeamPlayerRepository; } }
public void Save()
{
_unitOfWork.Save();
}
Instance.RegisterType(new PerThreadLifetimeManager())
.RegisterType();
public GameController(IService service)
{
_service = service;
}
_mockUnitOfWork = new Mock();
_mockServiceLayer = new Mock(_mockUnitOfWork.Object); //this line fails
GameController Controller = new GameController(_mockServiceLayer.Object);
1 Câu trả lời
如果要测试GameController
的方法您只需要模拟/ stub 该类的依赖项。只需这样做:
_mockServiceLayer = new Mock();
_controller = new GameController(_mockServiceLayer.Object);
_mockServiceLayer.Verify(s=> s.Save(), Times.Once());
IService
中的属性获取存储库。并直接查询存储库。因此,如果您想测试您的 Controller 方法,您仍然需要模拟存储库,执行以下操作:
//Initialization before each test:
_mockUserRepo = new Mock();
//...other repositories
_mockServiceLayer = new Mock();
_mockServiceLayer.Setup(s => s.Users).Returns(_mockUserRepo.Object);
//... setup properties in IService for other repositories
_controller = new GameController(_mockServiceLayer.Object);
//In some test:
var user = new User();
_mockUserRepo.Setup(s => s.Get(123)).Returns(user);
call some controller method and make sure returned model is "user"
IService
.
//Arrange
var user = new User();
_mockServiceLayer.Setup(s => s.GetUser(123)).Returns(user);
//Act
var viewResult = _controller.GetUser(123) as ViewResult;
//Assert
Assert.AreEqual(user, viewResult.Model);
关于entity-framework - 如何构建工作单元/服务层/存储库,以便它们与 DI (Unity) 和 Moq 一起进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21724057/
我有一个测试,我像这样传入一个对象: var repo = new ActualRepo(); var sut = new Sut(repo); 在我的测试中,Repo 有一个我需要实际执行的方法,而
想知道是否有可能将 Prism 事件聚合器最小化 让我们以他们拥有的EventAggregator快速入门为例 [TestMethod] public void Presente
我正在 mock MSMQ 的包装器。包装器只是允许创建一个直接调用 MessageQueue 类的静态方法的对象实例。 我想测试阅读队列是否筋疲力尽。为此,我希望模拟包装器返回一些好的结果,并在第四
我正在尝试开始使用最小起订量,但无法找到任何好的资源来做我需要的事情。 我有一个数据接口(interface)类,它有一个通过存储过程返回数据集的 Get 方法。这就是代码的编写方式,我目前无法更改它
我想使用 Moq 框架。我想下载框架,所以我到达了http://code.google.com/p/moq/通过谷歌,但第一行提到这个项目已转移到GitHub。当我去 GitHub 时,我只看到了源代
我想看看 Moq 是否是我想在新项目中使用的东西,因为我使用的其他模拟框架正在挑战恕我直言。例如,我有一个方法: IEnumerable GetPickLists(); 我不确定我应该如何 mock
这看起来很简单,但我似乎无法让它工作。 我有一个带有 Save 方法的类,它只调用另一个方法 ShouldBeCalled()。我想验证如果我调用 Save() 另一个方法 ShouldBeCalle
我正在修改一个类方法,它格式化一些输入参数日期,这些日期随后在方法调用中用作参数到基类(位于另一个程序集中)。 我想验证我传递给我的方法的日期在传递给基类方法时的格式是否正确,因此我想对基类方法调用进
我有以下方法: public CustomObect MyMethod() { var lUser = GetCurrentUser(); if (lUser.HaveAccess)
我有一个对象,我正在尝试使用最小起订量来模拟。该对象的构造函数具有必需的参数: public class CustomerSyncEngine { public CustomerSyncEng
我找不到对齐的 moq 和 moq contrib 版本。我可能只是谷歌失败了。 详情: 是否有适用于 moq 版本 4.0.10827 的 moq.contrib 版本,最新版本来自 http://
有没有人试过这个? 我喜欢最小起订量,我喜欢 pex 正在做的事情,但还没有一起尝试过。我认为在大多数情况下,我更喜欢使用 moq 而不是痣,但很想知道是否有人遇到了障碍? 他们玩得好吗? 最佳答案
VerABLE() 的目的是什么? 如果我验证 Mock 并将其保留,它仍然会验证 SetUp。 编辑:我使用的是VerifyAll(),因此所有内容都被验证。更改为 Verify() 后,仅检查我的
我在一个使用 Moq 和 AutoFixture.AutoMoq 的特定项目的构建服务器上运行单元测试时遇到问题。这是错误: System.IO.FileLoadException : Could n
我正在尝试创建一个具体类的模拟,并用另一个模拟来模拟它的一个属性。 public class MyClass { public virtual IAdapter Adapter {get; int
我无法使用 Moq (v.4.2) 在 protected 方法上设置回调。 代码如下所示: public abstract class AbstractClass { protected a
我在我的测试约定中使用 AutoMoqCustomization。 考虑下面的代码。一切都很好,直到我向其中一个具体类添加构造函数。当我这样做时,我得到“找不到无参数构造函数”。我们知道 AutoFi
在 Moq 中模拟 protected 虚拟(非通用)方法很容易: public class MyClass { .... protected virtual int MyMethod(D
如何验证是否使用 Moq 调用了“CallWithRef”方法? public interface ITest { void CallWithoutRef(string value, List
在我的单元测试中使用 Moq 生成 stub 和模拟,我有一个案例,我想验证是否调用了采用 Delegate 参数的方法。我不关心提供的特定 Delegate 参数,我只想确保该方法实际上被调用。该方
Tôi là một lập trình viên xuất sắc, rất giỏi!