c# - 只调用单一依赖方法的单元测试方法 - c#/xUnit/Moq

标签 c# moq xunit

不好意思承认,但单元测试对我来说还是个新手。我非常清楚如何正确处理事情。但是我发现很难理解的一种情况是,当为一个只返回依赖方法调用结果的方法编写单元测试时。

我发现在您实现服务层以与 DAL 层互操作的情况下会出现几次。

一个简单的代码示例可能会更好地描述我的问题。

Note: The code example below is using c#, xUnit and Moq.

public class Foo {
    Bar int;
    Baz string;
}

public interface IFooRepository {
    Foo GetByBar(bar int);
}

public interface IFooService {
    Foo GetByBar(bar int);
}

public class FooService : IFooService {
    private IFooRepository fooRepository;

    public FooService(
        IFooRepository fooRepository){
        this.fooRepository = fooRepository; 
    }

    public Foo GetByBar(bar int)
    {
        return fooRepository.GetByBar(bar);
    }
}

[Fact]
public class FooServiceTests 
{
    public class GetByBarMethod 
    {
        [Fact]
        public void ShouldReturnBar()
        {
            //arrange
            var expectedFoo = new Foo() { Bar = 1, Baz = "baz" };
            var repo = new Mock<IFooRepository>();
            repo.Setup(r => r.GetByBar(1)).Returns(expectedFoo);

            var service = new FooService(repo.Object);

            //act
            var result = service.GetByBar(1);

            //assert
            Assert.Same(result, expectedFoo);
        }
    }   
}

我知道 FooService 单元测试的重点是测试方法内的逻辑,而不是依赖项的逻辑。那么,如果只是测试模拟依赖项的返回值,那么在这种情况下是否还有必要编写测试?

最佳答案

这是为了回答你的评论

Can you explain how you'd assert the method is called?

有两种方式

首先是使 Setup 期望 Verifiable()

repo
    .Setup(r => r.GetByBar(1))
    .Returns(expectedFoo)
    .Verifiable();

然后在调用后断言

//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
repo.Verify(); //Verifies that all verifiable expectations have been met.

第二个将使用类似于 Verify

中的 Setup 的表达式

例如

//...code removed for brevity

//act
var result = service.GetByBar(1);

//assert
Assert.Same(result, expectedFoo);
repo.Verify(r => r.GetByBar(1));

引用 Moq Quickstart

关于c# - 只调用单一依赖方法的单元测试方法 - c#/xUnit/Moq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52121867/

相关文章:

c# - 查找忽略指定字符的子字符串

c# - 如何为 IP 地址定义 TcpListener

c# - 如何将集线器内容从任何服务器带到*另一台服务器*项目集线器?

asp.net-core - 如何在 dotnet Core 中添加 moq 作为依赖项?

unit-testing - xUnit 等效于 MSTest 的 Assert.Inconclusive

c# - 未使用的代码是否包含在发布程序集中?

c# - 最小起订量如何正确模拟仅设置属性

c# - RestSharp 单元测试 NUnit Moq RestResponse 空引用异常

.net - Bitbucket 管道 .NET Core 测试输出

c# - 模拟 Url.RouteUrl