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

问题描述 投票:2回答:1

惭愧承认,但单元测试对我来说仍然是新的。我对如何妥善处理事情非常掌握。但是我发现难以理解的一个情况是,为一个简单地返回依赖方法调用结果的方法编写单元测试。

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

一个简单的代码示例可能更好地描述我在问什么。

注意:下面的代码示例使用c#,xUnit和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单元测试的重点是测试方法中的逻辑,而不是依赖项的逻辑。那么,如果只是测试一个模拟的依赖项的返回值,那么在这种情况下编写测试是否有意义呢?

c# moq xunit
1个回答
1
投票

这是为了回答您的评论

你能解释一下你怎么断言这个方法被调用了吗?

有两种方法

首先是使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.

第二个将使用类似于Setup中的Verify的表达式

例如

//...code removed for brevity

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

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

参考Moq Quickstart

© www.soinside.com 2019 - 2024. All rights reserved.