1

フレームワーク内でサービスをテストしています。

サービスを初期化するために、モック リポジトリ オブジェクトを使用しています。

ServiceTest.cs

private IRepository _repository;
private IService _service;
private List<Object> _objects;

[TestInitialize]
public void Initialize()
{
  _repository = new Mock<IRepository>().Object;

  _service = new Service(repository);

  _objects = new List<Object>()
  {
      new Object { Name = "random", ID = 1 },
      new Object { Name = "not so random", ID = 1},
      new Object { Name = "random", ID = 2 },
      new Object { Name = "not so random", ID = 2}
  };

  //attempt at mocking the repository
  _repository.Setup(r => r.GetObjects(It.IsAny<string>(), It.IsAny<int>())).Returns(_objects.Where(o => o.Name == _objects.Name && o.ID == _objects.ID).ToList());
}

[TestMethod]
public void GetObjects_ReturnObjectsList()
{
    //Arrange
    var name = "random";

    //Act
    var objects = _service.RetrieveObjects(name, 2);

    //Assert
    Assert.AreEqual(name, objects.Single().Name);
 }

ただし、サービスをテストすると、ArgumentNullExceptions. リポジトリ メソッドに設定された変数は returnnullを呼び出し、ビジネス ロジックの実行時に最終的にエラーをスローします。

Service.cs

    public List<Objects> RetrieveObjects(string name, int id) 
    {   
      var getObjects = repository.GetObjects(name, id); //getObjects return null

      DoLogic(getObjects); //ArgumentNullException is thrown here

      return getObjects; 
    }

リポジトリのモックに関する情報を調べましたが、テストするためだけにセットアップする必要があるようです。セットアップに価値があるかどうか疑問に思っています。

なぜ私は得ているのArgumentNullExceptionsですか?リポジトリを呼び出すメソッドをテストする方法はありますか?

4

3 に答える 3

2
var entity1 = new MyEntity();
var entity2 = new MyEntity();
var entities = new List<MyEntity>{entity1, entity2};

var mockRepository = new Mock<IRespository>();

mockRepository.Setup(r => r.GetObjects("some param")).Returns(entities);

var service = new Service(mockRepository.Object);

service.DoWork("some param");
//continue the test
于 2013-05-28T20:20:52.283 に答える