gpt4 book ai didi

c# - Autofac mock - 如何从依赖项中的特定方法设置/伪造数据?

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:47 25 4
gpt4 key购买 nike

我很可能是单元测试、Autofac 和模拟的新手,这相对容易,但我很难弄明白。

我有一个类 SystemUnderTest,它有一个依赖项和两个方法 GetValueOneGetValueTwo

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),则上述内容在执行时通过。

关于c# - Autofac mock - 如何从依赖项中的特定方法设置/伪造数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57261132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com