2016-04-09 11 views
0

IThing üyesi GetValue() tanımlanmamış olsa bile aşağıdaki örnekte FakeItEasy döndürme 0. Benim sorum; Neden tanımlı olmayan bir üye çağrısından 0 değeri döndürülür ve atılan bir istisna değil; tanımlanmamış üyeleri çağırmak için istisnalar atmanın bir hayır-hayır olduğunu belirten birtakım genel alaycı/sahtekarlık/saplama çerçeve yazılım modeli var mı?İstisnasız çerçeveler oluşturmamanın nedeni nedir?

public interface IThing 
{ 
    int GetValue(); 
} 

public class Thing: IThing 
{ 
    public int GetValue() 
    { 
     return 1000; 
    } 
} 

    [TestMethod] 
    public void Test1() 
    { 
     var thing= A.Fake<IThing>(); 
     // A.CallTo(() => thing.GetValue()).Returns(1); 
     var val = thing.GetValue(); // Not defined but returns 0 rather than throwing an exeption 
     Assert.AreEqual(1, val); 
    } 
+0

'var şey = A.Fake ();' Bu sahte IThing nesne (bir sahte nesne oluşturur Bir ITing, bir Thing nesnesi değil). 0 sadece bir int'nin varsayılan değeri olacaktır (başka bir şey döndürmek için belirtmediğiniz gibi). Genel olarak istisna davranışı hakkında emin değilim ama her şey geçerli olduğu için bu durumda atar. – Tone

+0

@Tone Bu sorduğum şey değil. Tanımlanamayan bir üye, .NET Çalışma Zamanı'nda Güçlü Olarak Yazılırken çağrılırken beklenen bir davranış istisnasıdır ve benim sorum, Ataşman çerçevelerinin daha gevşek bir semantik nedenidir. –

cevap

2

Bu büyük ölçüde fikir tabanlı bir sorudur ve büyük olasılıkla kapalı olacaktır. Ancak, burada bazı bilgiler. İlk önce, bazı çerçeveler varsayılan olarak katıdır ve bazıları daha gevşek semantiklere izin verir. FakeItEasy, ikincisine doğru yöneliyor. Bu seçim için verilen nedenler genellikle böyle bir tarzın daha az kırılgan testleri desteklemesidir - çünkü kullanıcı, “önemsiz” şeyler değiştiğinde, sahte bir nesne ile (ya da aldatmak istediğiniz her şeyle) her etkileşimi tanımlamak zorunda değildir. Testleriniz "sebepsiz" diye kırılmaz.

Bazı kişiler katı anlambilimden hoşlanır ve bazıları yoktur.

Not sıkı davranış istemek ederse, hem seçenekler uygulayarak, global bu davranışı açmak için strict fakes

var thing= A.Fake<IThing>(options => options.Strict()); 

Ve FakeItEasy 2.0.0-rc1 yılında, sen implicit creation options kullanabilirsiniz kullanarak FakeItEasy bunu elde edebilirsiniz böyle oluşturucu olmak satırında sahte tanımlarken

class MakeEverythingStrictOptionsBuilder : IFakeOptionsBuilder 
{ 
    public bool CanBuildOptionsForFakeOfType(Type type) 
    { 
     return true; 
    } 

    public void BuildOptions(Type typeOfFake, IFakeOptions options) 
    { 
     options.Strict(); 
    } 

    public Priority Priority 
    { 
     get { return Priority.Default; } 
    } 
} 
İlgili konular