1

データレイヤーで Unit Of Work パターンを使用しています。

public interface IUnitOfWork{
    IRepository<Class1> Class1s {get;}
    IRepository<Class2> Class2s {get;}
    ...
}

public interface IRepository<T> where T:class{
    IQueryable<T> GetAll();
}

これは私のコードベースで期待どおりに機能しています。ただし、サービス層でこれをテストする際に問題があります。

public class SomeService{
    private readonly IUnitOfWork uow;
    public SomeService(IUnitOfWork u){
        uow = u;
    }

    public IEnumerable<ViewModel1> GetViewModel(){
        var result1 = uow.Class1s.GetAll();
        var result2 = uow.Class2s.GetAll();
        var query = from r1 in result1
                    from r2 in result2
                       where r1.key == r2.key
                       select new ViewModel1{...};
        return result;
    }
}

(テスト)Moqを使用

[Test]
public void TestMethod(){
    var uow = new Mock<IUnitOfWork>();
    uow.Setup(u => u.Class1s.GetAll()).Returns(new []{ new Class1{...}}.AsQueryable());
    uow.Setup(u => u.Class2s.GetAll()).Returns(new []{ new Class2{...}}.AsQueryable());
    var service = new SomeService(uow.Object);
    var result = service.GetViewModel();
    Assert.AreEqual(1,result.Count());
}

テストは、result1 (および result2) が null であることを示す例外をスローしています。これは、プロパティを直接インスタンス化していないためであることに気付きました。しかし、モック内のプロパティもモックする必要がない方法があるかどうか疑問に思っていました。Moq を使用していない場合は、他のモッキング フレームワークでしょうか。

4

2 に答える 2

3

いいえ、ここでは Moq は役に立ちません。手動で設定する必要があります (ただし、モックすることもできます)。

var class1Mock = new Mock<IRepository<Class1>>();
var class2Mock = new Mock<IRepository<Class2>>();
var uow = new Mock<IUnitOfWork>();
uow.Setup(u => u.Class1).Returns(class1Mock.Object);
uow.Setup(u => u.Class2).Returns(class2Mock.Object);

onと.Setupについては、次の操作を行う必要があることに注意してください。GetAllclass1Mockclass2Mock

class1Mock
    .Setup(c => c.GetAll())
    .Returns(new [] { new Class1 {...} }.AsQueryable());

モックをこのように制御したい場合、残念ながら近道はありません。

注:あなたのケースでは役に立ちませんが (モックを直接制御したいので)、Moq を使用した AutoFixtureは、同様のシナリオでチェックアウトする価値があります。

于 2012-04-24T19:59:32.600 に答える
0

作業単位パターンの大きな利点は、データソースをコンシューマーから抽象化し、テストでの実装方法を決定できることです。

あなたはモックルートに行くことを選ぶことができます、それはあなたが避けてきたように、テストごとに少しの構成オーバーヘッドです。または、作業単位を実装する具象クラスを作成し、それをステートフルテストダブルとして使用することもできます。

私の経験では、テストはテストダブルアプローチとは異なった感じがします。テストは、作業単位が使用される回数や順序を気にせず、最終結果に焦点を合わせます。

于 2012-04-25T01:55:38.363 に答える