c# - Autofac mock - 如何从依赖项中的特定方法设置/伪造数据?
问题描述
我很可能是单元测试、Autofac 和模拟的新手,这相对容易,但我很难弄清楚。
我有这个类SystemUnderTest
,有一个依赖项,两个方法GetValueOne
和GetValueTwo
.
public class SystemUnderTest : ISystemUnderTest
{
private readonly IDependency _dependency;
public SystemUnderTest(IDependency dependency)
{
_dependency = dependency;
}
public string GetValueOne()
{
return _dependency.GetValueOne();
}
public string GetValueTwo()
{
return _dependency.GetValueTwo();
}
}
public interface ISystemUnderTest
{
string GetValueOne();
string GetValueTwo();
}
这些方法从依赖项中获取数据。
public class Dependency : IDependency
{
public string GetValueOne()
{
return "get-value-one";
}
public string GetValueTwo()
{
return "get-value-two";
}
}
public interface IDependency
{
string GetValueOne();
string GetValueTwo();
}
我试图从其中一种方法(“ GetValueTwo
”)中伪造数据,因此它返回"expected value"
而不是"get-value-two"
依赖项通常返回的数据。
[Fact]
public async Task Test_SystemUnderTest()
{
using (var mock = AutoMock.GetLoose())
{
// Setup
mock.Mock<IDependency>().Setup(x => x.GetValueTwo()).Returns("expected value");
// Configure
mock.Provide<IDependency, Dependency>();
// Arrange - configure the mock
var sut = mock.Create<SystemUnderTest>();
// Act
var actual_GetValueOne = sut.GetValueOne();
var actual_GetValueTwo = sut.GetValueTwo();
// Assert - assert on the mock
Assert.Equal("get-value-one", actual_GetValueOne);
Assert.Equal("expected value", actual_GetValueTwo);
}
}
我的测试的第一部分,这Setup
件作品,似乎没有任何效果,这可能是因为我做错了一些基本的事情。
有人对如何挽救我的一天有见解吗?
解决方案
实现的成员Dependency
需要有虚拟成员才能在进行部分模拟时被覆盖。
public class Dependency : IDependency {
public virtual string GetValueOne() {
return "get-value-one";
}
public virtual string GetValueTwo() {
return "get-value-two";
}
}
然后类似于另一个答案中的建议,您将改为模拟实现,确保使其能够调用基本成员并仅设置您需要覆盖的成员。
public void Test_SystemUnderTest() {
using (var mock = AutoMock.GetLoose()) {
// Setup
var dependency = mock.Mock<Dependency>();
dependency.CallBase = true;
dependency.Setup(x => x.GetValueTwo()).Returns("expected value");
// Configure
mock.Provide<IDependency>(dependency.Object);
// Arrange - configure the mock
var sut = mock.Create<SystemUnderTest>();
// Act
var actual_GetValueOne = sut.GetValueOne();
var actual_GetValueTwo = sut.GetValueTwo();
// Assert - assert on the mock
Assert.AreEqual("get-value-one", actual_GetValueOne);
Assert.AreEqual("expected value", actual_GetValueTwo);
}
}
如果需要模拟的实现成员可以被覆盖(即virtual
),则上述方法在执行时通过。
推荐阅读
- objective-c - 是否有使用#selector 的 UIApplication.didBecomeActiveNotification 的替代方法?
- java - 使用 Java Hibernate 和 JPA 建模友谊的最佳方法是什么
- javascript - JavaScript - 如何在变量中存储和使用函数的返回值
- javascript - "res.end" 不是 "res.on('end', () =>" (express.js) 中的函数
- java - 如何在 TextView 中反复更改点击单词的颜色 - Android Studio?
- webpack - 在监视模式和 Firebase 模拟器中使用 Webpack 时如何启用热重载:开始
- tensorflow - (TensorFlowLite Model Maker) ValueError: Expect x to be an non-empty array or dataset (Colab)
- r - Alert / notification in shiny
- python - 使用 setuptools 构建 Python Wheel 会引发错误 Function not implemented: '
.egg-info/dependency_links.txt' - javascript - Vuetify 自动完成,接受列表之外的值