2011-04-05 7 views
8
는 IEnumerable

를 확장 인터페이스를 조롱하고 나는 다음과 같은 인터페이스를 가지고하는 방법 : 다음내가 MOQ를 사용하고

public interface IGameBoard : IEnumerable<PieceType> 
{ 
    ... 
} 
public class GameBoardNodeFactory 
{ 
    public virtual GameBoardNode Create (int row, int column, IGameBoard gameBoard) 
    { 
     ... 
    } 
} 

을 나는이 같은 시험이 있습니다

var clonedGameBoardMock = new Mock<IGameBoard> (MockBehavior.Loose); 
var gameBoardNodeFactoryMock = new Mock<GameBoardNodeFactory>(); 
gameBoardNodeFactoryMock.Setup (x => 
    x.Create (
     position.Row, 
     position.Column, 
     clonedGameBoardMock.Object)).Returns (new GameBoardNode { Row = position.Row, Column = position.Column }); 

그러나 gameBoardNodeFactoryMock.Object을 .Create (position.Row, position.Column, clonedGameBoardMock.Object)는 NullReferenceException을 발생시킵니다. IGameBoard 모의를 만들어 IEnumerable <PieceType> 인터페이스를 확장하지 않도록 만든 다음 작동합니다.

도움을 주시면 감사하겠습니다.

답변

0

누구든지 관심이 있다면 Moq을 버전 4로 업데이트 했으므로 모든 것이 예상대로 작동합니다.

0

이 상황에서 null 참조는 대개 설정이 충족되지 않았 음을 의미합니다. 그것이 설정 한 정확한 값으로 호출 된 적이 없다는 것을 의미합니다. 이것을 디버깅하기 위해서는 It.IsAny() 등을 사용하여 일치를 덜 제약하게 만들 것입니다. 테스트가 조롱 된 함수에 대한 호출과 일치하는지 확인하십시오. 대부분의 경우이 정도면 충분합니다. 귀하가 특정 가치에 맞추려고하는 이유는 무엇입니까?

10

호출되는 경우 GetEnumerator()에 대한 설치 프로그램을 만들어야합니다. 즉,이 경우에 문제가 있는지 모르겠지만, 만약 당신이 IEnumerable<T>을 조롱해야하는 경우 협조 할

var mockPieces = new List<PieceType>; 
clonedGameBoardMock.Setup(g => g.GetEnumerator()).Returns(mockPieces.GetEnumerator()); 

참고 : 같은 뭔가.

3

The answer by @DanBryant 또한 Google 솔루션의 핵심이었습니다. 그러나이 경우 열거자를 실수로 다시 사용할 수 있습니다. 대신, 내가 사용하는 것이 좋습니다 :

여기
clonedGameBoardMock.Setup(g => g.GetEnumerator()).Returns(() => mockPieces.GetEnumerator()); 

전체 생식의 (NUnit과 2.6.4 및 MOQ 4.2을 사용하여 새 클래스 라이브러리 것은) :

그것은 가치가 무엇인지에 대한
public interface IMyThing<T> : IEnumerable<T> 
{ 
    string Name { get; set; } 

    IMyThing<T> GetSub<U>(U key); 
} 

public interface IGenericThing 
{ 
    string Value { get; set; } 
} 

public class Pet 
{ 
    public string AnimalName { get; set; } 
} 

public class Unit 
{ 
    public IEnumerable<Pet> ConvertInput(IMyThing<IGenericThing> input) 
    { 
     return input.GetSub("api-key-123").Select(x => new Pet { AnimalName = x.Value }); 
    } 
} 

[TestFixture] 
public class Class1 
{ 
    [Test] 
    public void Test1() 
    { 
     var unit = new Unit(); 
     Mock<IMyThing<IGenericThing>> mock = new Mock<IMyThing<IGenericThing>>(); 
     Mock<IMyThing<IGenericThing>> submock = new Mock<IMyThing<IGenericThing>>(); 

     var things = new List<IGenericThing>(new[] { new Mock<IGenericThing>().Object }); 

     submock.Setup(g => g.GetEnumerator()).Returns(() => things.GetEnumerator()); 
     mock.Setup(x => x.GetSub(It.IsAny<string>())).Returns(submock.Object); 

     var result = unit.ConvertInput(mock.Object); 
     Assert.That(result, Is.Not.Null.And.Not.Empty); 
     Assert.That(result, Is.Not.Null.And.Not.Empty); // This would crash if the enumerator wasn't returned through a Func<>... 
    } 
} 

/이 질문에 팝업 만들려면 고독한 Google 직원과 동일한 문제가 있습니다. 위의 내용은 IEnumerable<T>을 구현하는 Couchbase. NET 클라이언트의 IView<T> 인터페이스의 추상화 된 버전입니다.