- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个要测试的抽象类。我的 DAO 在这个类中有一个抽象属性,我在继承的类中定义了它。
public abstract class DeviceGroupManagerBase<TDeviceGroup> where TDeviceGroup : DeviceGroup
{
protected abstract IDeviceGroupDao<TDeviceGroup> DeviceGroupDao { get; }
public TDeviceGroup UpdateDeviceIndexes(Device device)
{
return DeviceGroupDao.GetDeviceGroup(device.Group.Id);
}
}
我想测试 Updatedeviceindexes 方法,所以我试图模拟一个名为 DeviceGroupDao
的属性.
[TestFixture]
[Category("Unit")]
public class DeviceGroupManagerBaseTests
{
private IFixture fixture;
private Mock<DeviceGroupManagerBase<DeviceGroup>> subject;
private Mock<IDeviceGroupDao<DeviceGroup>> deviceGroupDaoMock;
private DeviceGroupManagerBase<DeviceGroup> Manager => subject.Object;
[TestFixtureSetUp]
public void Init()
{
fixture = new Fixture().Customize(new AutoMoqCustomization());
deviceGroupDaoMock = fixture.Freeze<Mock<IDeviceGroupDao<DeviceGroup>>>();
subject = fixture.Freeze<Mock<DeviceGroupManagerBase<DeviceGroup>>>();
}
[Test]
public void TestUpdateDeviceIndexes()
{
var device = fixture.Create<Device>();
var deviceGroup = fixture.Create<DeviceGroup>();
deviceGroupDaoMock.Setup(x => x.GetDeviceGroup(It.IsAny<int>())).Returns(deviceGroup);
var result = Manager.UpdateDeviceIndexes(device);
// The resultDeviceGroup will not be contain a previously defined object
Assert.AreEqual(deviceGroup.Id, result.Id);
}
}
我还尝试通过这种方式为我的设备对象添加注册:
fixture.Register(() => deviceGroup);
但我仍然得到一个新对象。
我如何模拟 IDeviceGroupDao<TDeviceGroup>
?
最佳答案
因为 DeviceGroupManagerBase
是一个抽象基类,所以您需要一个 SUT Double .如果将 DeviceGroupDao
属性设置为 public
,这是最容易做到的:
public abstract class DeviceGroupManagerBase<TDeviceGroup> where TDeviceGroup : DeviceGroup
{
public abstract IDeviceGroupDao<TDeviceGroup> DeviceGroupDao { get; }
public TDeviceGroup UpdateDeviceIndexes(Device device)
{
return DeviceGroupDao.GetDeviceGroup(device.Group.Id);
}
}
否则,您将需要使用 Moq 的 API 来定义和覆盖 protected
成员,这是可能的,但需要更多工作。
然后你需要覆盖subject
的DeviceGroupDao
属性:
subject.SetupGet(x => x.DeviceGroupDao).Returns(deviceGroupDaoMock.Object);
完整测试如下:
[TestFixture]
[Category("Unit")]
public class DeviceGroupManagerBaseTests
{
private IFixture fixture;
private Mock<DeviceGroupManagerBase<DeviceGroup>> subject;
private Mock<IDeviceGroupDao<DeviceGroup>> deviceGroupDaoMock;
private DeviceGroupManagerBase<DeviceGroup> Manager => subject.Object;
[OneTimeSetUp]
public void Init()
{
fixture = new Fixture().Customize(new AutoMoqCustomization());
deviceGroupDaoMock = fixture.Freeze<Mock<IDeviceGroupDao<DeviceGroup>>>();
subject = fixture.Freeze<Mock<DeviceGroupManagerBase<DeviceGroup>>>();
subject.SetupGet(x => x.DeviceGroupDao).Returns(deviceGroupDaoMock.Object);
}
[Test]
public void TestUpdateDeviceIndexes()
{
var device = fixture.Create<Device>();
var deviceGroup = fixture.Create<DeviceGroup>();
deviceGroupDaoMock.Setup(x => x.GetDeviceGroup(It.IsAny<int>())).Returns(deviceGroup);
var result = Manager.UpdateDeviceIndexes(device);
Assert.AreEqual(deviceGroup.Id, result.Id);
}
}
这现在在我的机器上通过了。
关于c# - AutoFixture AutoMoq 不使用我的属性模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47219510/
使用 AutoMoqCustomization 我本希望我的测试能成功,但它失败了。 这是测试: [Test, AutoMoqData] public void Test1( [Frozen]
我想探索我们是否可以通过设置 AutoMoq 创建的所有 Moq-mock 默认返回 Fixture 创建的值作为方法返回值来节省时间。 在进行如下测试时,这将是有益的: [TestMethod] p
当我注意到 AutoFixture AutoMoq 时,我正在查看 nuget 并想导入 moq。我看到 AutoFixture 是为了帮助更快地编写 TDD,但我找不到 AutoMoq 的任何示例以
我想知道在使用设置 AutoData 的测试用例时,是否有一种方法可以在调用被测系统 (SUT) 的构造函数之前为依赖项设置模拟. 我的 SUT 看起来像: class Sut { priva
我有一个要测试的抽象类。我的 DAO 在这个类中有一个抽象属性,我在继承的类中定义了它。 public abstract class DeviceGroupManagerBase where TDev
我将 AutoFixture 与 AutoMoqCustomization 一起使用并尝试创建一个包含只读属性的类的实例: public override ILog Logger { get; } =
我刚刚开始在我的单元测试中使用 AutoFixture.AutoMoq,我发现它对于创建我不关心具体值的对象非常有帮助。毕竟,匿名对象创建就是它的全部。 当我关心一个或多个构造函数参数时,我遇到了困难
我想编写一个单元测试来覆盖对象图中相当深的一些只读属性。我的意思是这样的方法: public string MethodToTest(IClassA classA) { return clas
当我需要模拟一些像这样的类时: public class Dummy { private readonly int _someInt; private readonly int _someOt
希望有人能给我出出主意。 我需要创建一个满足以下条件的模拟对象: 它实现了 IEntity 接口(interface)。 它使用我在 EntityBase 中已有的基础实现。 属性是使用 AutoFi
默认情况下,Moq 不进行递归模拟。也就是说,对于对模拟没有期望的成员,Moq 返回默认值。例如,给定: public interface IFoo { Bar Bar(); } 和 publ
public interface IResult { bool Success { get; } } public interface IResult : IResult { } 使用 Aut
更新: AutoFixture 团队 released a fix为此,在 3.51 版中。 只需扩展 AutoDataAttribute这样做: public class AutoDataFixed
例如 ISomething是一个具有三个属性的接口(interface):string Name和 int Count和一些复杂的属性ImComplex (具有循环依赖等)我不想建立 AutoFixt
我将 AutoFixture 与 AutoMoq 一起使用。我尝试创建一个类的假实例,该类的属性带有 getter 但没有 setter。我希望 AutoFixture 能够配置模拟,这样即使没有 s
我正面临一个与 AutoFixture 相关的奇怪问题和 AutoMoqCustomization以及它如何处理具体类的自动模拟。我怀疑我没有很好地使用它,但想知道问题出在哪里。首先是她的一些背景。假
我提议在我们公司使用 AutoFixture 和 AutoFixture.xUnit,并且已经获得授权,对于某些对象和字段,他们需要以预期方式格式化的随机数据。例如,他们希望 PersonName 只
既然已经找到了解决方案,那么简短的总结: AutoFixture 返回卡住模拟就好了;我的 sut 也是由 AutoFixture 生成的,它只有一个公共(public)属性,其中包含对测试很重要的本
我正在尝试测试使用存储库服务的服务类。我有自定义设置,我认为应该与我的存储库服务一起使用,但返回默认的匿名结果。如果您查看下面的代码示例,当我调用 svc.GetFoos 方法时,我试图取回我在自定义
我写这篇文章是因为我尝试了一点自己解决这个问题,但没有成功。无论出于何种原因,我能找到的每个示例似乎都表明这只是开箱即用,但每当我尝试这样做时,我总是会出错。基本上,我有一个 Controller ,
我是一名优秀的程序员,十分优秀!