Bu, o tam yöntem uygulaması şunlardır varsayarak çalışması gerekir
public class MyProgram
{
public bool hello(string name, int age)
{
string lastName = GetLastName();
return string.Format("hello {0}", lastName);
}
public virtual string GetLastName()
{
return "xxx";
}
}
public class MyProgramTests
{
[TestMethod]
public void MyTest()
{
string stringToReturn = "qqq";
Mock<MyProgram> name = new Mock<MyProgram>();
name.CallBase = true;
name.Setup(x => x.GetLastName()).Returns(stringToReturn);
var results = name.Object.hello(It.IsAny<string>(), It.IsAny<int>());
string expected = string.Format("hello {0}", results);
Assert.AreEqual(expected, results);
}
}
Ben hala oldukça Yorumlarınız takip etmiyorum:
parametre gerçekten ne yapmalıdır Mock ne anlama geliyor ?? olabilir mi? Özür dilerim, sözdizimini tam olarak anlamıyorum. Açıklığa kavuşturmak için, sahte, kodlarıma kırılma noktaları koyduğumda, kesme noktalarının ben alay ettiğim yöntemleri atlaması gerektiği anlamına gelir. Ben haklı mıyım Ayrıca sınıf var oldukça çok şey anlamına gelen genel bir gösterge olma T
-
Mock<T>
Eğer
T
bir tür alay sağlar. Geleneksel olarak, gerçek bir
class
değil, bir
interface
alaycı olurdu, ancak yukarıdaki örnekte bir sınıf alay ediyoruz. Test edilen örnek birim testi için, birim testinin amacı
hello(string, int)
'un uygulanmasını test etmektir.
hello(string, int)
'un,
GetLastName()
adı verilen bu sınıftaki başka bir yönteme dayandığını biliyoruz.
GetLastName()
un uygulanması önemli olsa da,
hello(string, int)
birim testinin kapsamı için önemli değildir. Bu nedenle, bağımlılığın uygulaması konusunda endişelenmeden,
hello(string, int)
'un işlevselliğini test etmek için aramayı ve geri dönüşünü dalgalandırıyoruz.
Umarım biz sınıf MyProgram
alay ve cevap GetLastName()
Teşekkür (sahte) Yeni bir uygulama sağlıyorsanız o daha belirgin hale getirmek için gerçek sınıf adları ile yukarıda kuşattı. Başka bir yöntemi arayan başka bir yöntemi arayan bir yöntemi test etmek istersem ne olur? Örneğin için. metot merhaba başka bir yöntem mi çağırdı? Eğer birim testleri inşa ederken
aynı ilke geçerlidir (onlar ünite testler değil, entegrasyon testleri veya diğer, her zaman bir açık teste konsantre olmak istiyorum varsayarak biz test birimi Bar()
iseniz yöntemi. What's the difference between unit and integration tests?
public class Foo
{
public string Bar()
{
return string.Format("{0}Bar", Baz(5));;
}
public virtual string Baz(int someNumber)
{
return string.Format("{0}Baz", DoStuff(someNumber).ToString());
}
public virtual int DoStuff(int someNumber)
{
return someNumber+1;
}
}
biz Baz(int)
uygulanması veyadaha kötüsü umurumda değil. Not biz uygulama uygulamasının değer vermediğine dikkat etmiyoruz. Bar()
s perspektifinden, önemli olan tek şey Baz(int)
bir dize döndürmesidir. Hangi dize? Bar()
s birim testi için önemli değildir.
Numune Bar()
test: Biz Baz(int)
gerçek uygulama göz ardı edilmektedir yukarıdaki içinde
[TestMethod]
public void Bar_ReturnsBazValueWithBarAppended
{
// Arrange
string testBazReturn = "test";
Mock<Foo> mock = new Mock<Foo>();
mock.CallBase = true;
mock
.Setup(s => s.Baz(It.IsAny<int>())
.Returns(testBazReturn);
// Act
var results = mock.Object.Bar();
// Assert
Assert.AreEqual(string.Format("{0}{1}", testBazReturn, "Bar"), results);
mock.Verify(v => v.Baz(It.IsAny<int>())); // Verifies that Baz was called
}
Bildirim, Baz(int)
bizim gerçek uygulamaları ve DoStuff(int)
, fark etmez, ve DoStuff(int)
bile gelmiyor oyuna. Biz Baz(int)
test etmek olsaydı
Şimdi, sadece aynı zihniyeti izleyin: şimdi biz test birimi Baz(int)
olduğumuza göre, yukarıdaki olarak
[TestMethod]
public void Baz_ReturnsDoStuffValueWithBazAppended
{
// Arrange
int testDoStuffReturn = 1;
Mock<Foo> mock = new Mock<Foo>();
mock.CallBase = true;
mock
.Setup(s => s.DoStuff(It.IsAny<int>())
.Returns(testDoStuffReturn);
// Act
var results = mock.Object.Baz(5);
// Assert
Assert.AreEqual(string.Format("{0}{1}", results, "Baz"), results); // Validates the result
mock.Verify(v => v.DoStuff(It.IsAny<int>())); // Verifies that DoStuff was called
}
, yaklaşık Bar()
ve sadece umurumda değil
012: biz
DoStuff(int)
değer verdiğim şey, bir değer döndüren (. ama
nasıl o değerde geldiğinde)
Ve nihayet DoStuff(int)
olmasıdır
[TestMethod]
public void DoStuff_ReturnsParameterPlusOne()
{
// Arrange
Foo foo = new Foo();
int passed = 1;
int expected = passed + 1;
// Act
var results = foo.DoStuff(passed);
// Assert
Assert.AreEqual(expected, results);
}
Hangi sorunu denediniz? Bu doğru görünüyor – Kritner
Kesme noktası koyduğumda, soyadımın adı = xxx değeri. – codeislife