2013-10-09 1 views
2

Для кода ниже я получаю эту ошибку и утверждают, не знаю, почему:NSubstitute: Arg.Do не отвечает список параметров, называемых

Assert.AreEqual failed. Expected:<2>. Actual:<0>.

public interface IA 
{ 
    void MethodA(B b); 
} 

public class A : IA 
{ 
    public void MethodA(B b) {/*no matter*/} 
} 

public class B 
{ 
    public string PropertyB { get; set; } 
} 

public class MyLogic 
{ 
    private IA _a; 
    public MyLogic(IA a) 
    { 
     _a = a; 
    } 
    public void DoLogic() 
    { 
     _a.MethodA(new B { PropertyB = "first" }); 
     _a.MethodA(new B { PropertyB = "second" }); 
    } 
} 

[TestClass] 
public class MyLogicTests 
{ 
    [TestMethod] 
    public void CallTwiceAndCheckTheParams() 
    { 
     List<B> args = new List<B>(); 
     IA a = Substitute.For<IA>(); 

     new MyLogic(a).DoLogic(); 

     a.Received(2).MethodA(Arg.Do<B>(x => args.Add(x))); 
     Assert.AreEqual(2, args.Count); 
    } 
} 

ответ

5

Код настройка действия для выполнения (Arg.Do) после того, как звонки уже сделаны. Я думаю, что это то, что вы находитесь:

List<B> args = new List<B>(); 
IA a = Substitute.For<IA>(); 
a.MethodA(Arg.Do<B>(x => args.Add(x))); // do this whenever MethodA is called 

new MyLogic(a).DoLogic(); 

a.Received(2).MethodA(Arg.Any<B>()); 
Assert.AreEqual(2, args.Count); 
Смежные вопросы