code

Moq 모의 객체를 생성자에 전달

codestyles 2021. 1. 6. 08:22
반응형

Moq 모의 객체를 생성자에 전달


한동안 RhinoMocks를 사용해 왔지만 Moq를 살펴보기 시작했습니다. 나는이 매우 기본적인 문제를 가지고 있으며 이것이 상자에서 바로 날아 가지 않는다는 것이 놀랍습니다. 다음과 같은 클래스 정의가 있다고 가정합니다.

public class Foo
{
    private IBar _bar; 
    public Foo(IBar bar)
    {
        _bar = bar; 
    }
    ..
}

이제 Foo로 보내는 IBar를 Mock해야하는 테스트가 있습니다. RhinoMocks에서는 다음과 같이 간단히 수행 할 수 있으며 훌륭하게 작동합니다.

var mock = MockRepository.GenerateMock<IBar>(); 
var foo = new Foo(mock); 

그러나 Moq에서는 동일한 방식으로 작동하지 않는 것 같습니다. 다음과 같이하고 있습니다.

var mock = new Mock<IBar>(); 
var foo = new Foo(mock); 

그러나 지금은 실패합니다. " 'Moq.Mock'에서 'IBar'로 변환 할 수 없습니다. 내가 뭘 잘못하고 있습니까? Moq에서 권장하는 방법은 무엇입니까?


모의 객체 인스턴스를 통과해야합니다.

var mock = new Mock<IBar>();  
var foo = new Foo(mock.Object);

모의 객체를 사용하여 인스턴스의 메서드에 액세스 할 수도 있습니다.

mock.Object.GetFoo();

moq 문서


var mock = new Mock<IBar>().Object

이전 답변은 정확하지만 완전성을 위해 한 가지 더 추가하고 싶습니다. 도서관의 Linq기능을 사용 합니다 moq.

public interface IBar
{
    int Bar(string s);

    int AnotherBar(int a);
}

public interface IFoo
{
    int Foo(string s);
}

public class FooClass : IFoo
{
    private readonly IBar _bar;

    public FooClass(IBar bar)
    {
        _bar = bar;
    }

    public int Foo(string s) 
        => _bar.Bar(s);

    public int AnotherFoo(int a) 
        => _bar.AnotherBar(a);
}

전화를 사용 Mock.Of<T>하고 피할 수 있습니다 .Object.

FooClass sut = new FooClass(Mock.Of<IBar>(m => m.Bar("Bar") == 2 && m.AnotherBar(1) == 3));
int r = sut.Foo("Bar"); //r should be 2
int r = sut.AnotherFoo(1); //r should be 3

또는 매처 사용

FooClass sut = new FooClass(Mock.Of<IBar>(m => m.Bar(It.IsAny<string>()) == 2));
int r = sut.Foo("Bar"); // r should be 2

참조 URL : https://stackoverflow.com/questions/7011572/passing-moq-mock-objects-to-constructor

반응형