2013-02-07 16 views
5

Taklit:aşağıdaki taklit hakkında gitmek nasıl bir genel yöntem FakeItEasy

sahte basitçe herhangi bir değişiklik olmadan argüman var dönmek için ne isterim
public interface IBlah 
{ 
    Func<T, bool> ApplyFilter<T>(Func<T, bool> predicate) where T:IMessage; 
} 

. Ancak, sahte bir kez tam olarak çağrıldığını doğrulamak istiyorum. aracılığıyla bir geçiş olarak hareket

public class Something 
    { 

    public Something(IBlah blah) { _blah = blah; } 

    public bool DoSomething(SomeValue m, Func<SomeValue, bool> predicate) 
    { 
     Func<SomeValue, bool> handler = _blah.ApplyFilter(predicate); 
     return handler(m); 
    } 
    } 

yani sahte ihtiyaçlarını ama aynı zamanda kullanılır oldu doğrulamak gerekiyor: Bir kullanım örneği aşağıda verilmiştir.

Bu konuda gitmenin en iyi yolu nedir?

[orada yorganın altında oluyor bir çok şey, ama yukarıdaki örnekte için aşağı basitleştirdik ... yapmacık örnek dert etmeyin.]

+1

en az bir kez kullanılan, veya tam olarak bir kez kullanılır, bu en fazla bir kez kullanıldığını doğrulamak istiyor musunuz? Bu şartı yerine getirmezse ne olur? Bu arabirimin bir "numInvocations" özelliği var mı? Bunu, bir kez daha * yeterli * olarak adlandıramayacağınızı, ancak çağrılmadığınızı bildiğinizden emin olabilirsiniz. Geri bildirim sağlamanın bir yoluna ihtiyacınız var. – Servy

+0

İlgili jenerikler dahil olmak üzere, var fake = A.Fake (); A.CallTo (() ==> fake.SomeMethod (A ._)) .ReturnsLazily (x => x.GetArgument (0)); .... A.CallTo (sahte) .MustHaveHappened (Repeated.Exactly.Once); Aynı şeyi Func jenerik varlığında nasıl yapılacağını anlayamıyorum. Arayüzün bir Dummy uygulaması oluşturmayı denedim ve bu geçişi yapabildi, ancak bu somut olduğundan, FakeItEasy kullanıldığını doğrulayamıyor. – ashic

+0

Yani, bir kez tam olarak gerçekleştiğinden emin olmanız gerektiğinden, iki özellik olan NumInvokations' ve bu işleve sahip bir sınıf döndürme yöntemini isteyeceksiniz. İşlevi başka bir yere aktarın, sonra 'NumInvokations' öğesinin bire eşit olup olmadığını belirleyin. – Servy

cevap

2

Bu sorununuzu çözmek istiyorsunuz ? Bu yüklem geçmesine ve ayrıca ApplyFilter sadece bir kere çağrılan olduğunu doğrular

[Fact] 
    public void TestFeature() 
    { 
     var fake = A.Fake<IBlah>(); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).ReturnsLazily(x => 
      { 
       return x.GetArgument<Func<int, bool>>("predicate"); 
      }); 
     var something = new Something(fake); 
     var result = something.DoSomething(1, x => x > 1); 

     Assert.False(result); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).MustHaveHappened(Repeated.Exactly.Once); 
    } 
+0

T'yi int olarak belirtirken işe yarayacak olsa da, her tür için çalışması gereken genel bir versiyon arıyorum. Aşağıdaki tür, elde etmeye çalıştığım şeyi gösterir: http://pastebin.com/fJgi6ikj Diğer bir deyişle, sahte, tam tür belirtmek zorunda kalmadan * herhangi bir * IMessage için çalışmalıdır. – ashic

İlgili konular