Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ASP.NET MVCÖ®µ¥Ôª²âÊÔ·Ö·ÖÖÓµÄÊÂ
 
»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-09-26
  4321  次浏览      27
 

Ò»¡¢ÎªÊ²Ã´Òª½øÐе¥Ôª²âÊÔ£¿

´ó²¿·Ö¿ª·¢Õß¶¼Óиöϰ¹ß£¨°üÀ¨±¾ÈËÔÚÄÚ£©£¬³£³£²»Ï²»¶È¥×öµ¥Ôª²âÊÔ¡£ÒòΪÎÒÃǶÔ×Ô¼ºÐ´µÄ³ÌÐò×ÜÊÇäĿ×ÔÐÅ£¬»òÕß´æÔÚ½ÄÐÒÐÄÀíÿ´ÎÔËÐÐͨ¹ýºó¾ÍÖ±½ÓÈÓ¸ø²âÊÔ×éµÄÃÃ×ÓÃÇÁË¡£½á¹ûÃÃ×ÓÒ»²â£¬´ó°Ñ´ó°ÑµÄbug³öÏÖÁË£¬×îºóÿÿ¿´µ½²âÊÔµÄÃÃ×Ó×ß¹ýÀ´£¬ÐÄÀï¾ÍÖ»Ïë˵һ¾ä»°£ºÄãÊǺï×ÓÇëÀ´µÄ¶º±ÈÂ𣿱¾À´Ïë½Úʡʱ¼ä£¬½á¹û×îºó»¨ÔÚÕÒBUGºÍÐÞ¸´BUGµÄÕâЩʱ¼ä¼ÓÆðÀ´ÒѾ­±È¿ª·¢Õâ¸öÄ£¿éËù»¨µÄʱ¼ä»¹Òª¶àÁË£¬×îºó¸üÒªÃüµÄÊÇ£¬¿ÓµùµÄ¼Ó°à¾ÍÔÚËùÄÑÃâÁË£¡Èç¹ûÒ»¿ªÊ¼½«bug¶ôÖÆÔÚÃÈѿ״̬£¬ÎÒÃÇÖÁÓÚÕâô¿à±ÆÂð£¿SO£¬µ¥Ôª²âÊÔºÜÓбØÒª£¡

¶þ¡¢µ¥Ôª²âÊÔ·¨Ôò

1¡¢µ¥Ôª²âÊÔ±ØÐëÄܹ»Öظ´Ö´ÐУ¬¾ÍÊÇÄܹ»·Ç³£Æµ·±µØÖ´ÐÐ

2¡¢µ¥Ôª²âÊÔµÄÖ´ÐÐËٶȲ»ÄÜÌ«Âý£¬Òª²»È»»áÓ°Ï쿪·¢½ø¶ÈµÄ

3¡¢µ¥Ôª²âÊÔ²»Ó¦¸ÃÒÀÀµÓÚÍⲿ×ÊÔ´ºÍÕæÊµµÄ»·¾³

4¡¢µ¥Ôª²âÊÔ²»Ó¦¸ÃÉæ¼°µ½ÕæÊµÊý¾Ý¿âµÄ²Ù×÷

5¡¢ÒªÈ·±£µ¥Ôª²âÊԵĿÉÐŶÈ

6¡¢µ¥Ôª²âÊÔͨ³£ÒÔ²âÊÔÒ»¸ö·½·¨Îªµ¥Î»

7¡¢Ã¿Ò»¸ö³ÌÐòÔ³¶¼ÐèҪΪ×Ô¼ºÐ´µÄ´úÂë±àдµ¥Ôª²âÊÔ´úÂë

Èý¡¢µ¥Ôª²âÊÔ¹¤¾ß

ÎÒÔÚÕâÀï½ö½öÍÆ¼öÒ»¸ö±È½ÏʵÓõIJâÊÔ¹¤¾ßNUnit£¬¿Éµ¥¶ÀʹÓã¬Ò²¿ÉÒÔͨ¹ýTestDriven.NET£¨TestDriven.NETÊÇÒÔ²å¼þÐÎʽ¼¯³ÉÔÚVisual Studio IDEÖеĵ¥Ôª²âÊÔ¹¤¾ß£¬ÍêÈ«¼æÈÝËùÓÐ.NET Framework°æ±¾£¬²¢ÇÒ¼¯³ÉÁ˶àÖÖµ¥Ôª²âÊÔ¿ò¼ÜÖîÈçNUnit£¬MbUnit£¬ÒÔ¼° MS Team System µÈ£©½«Æä¼ÓÈëµ½vsÖС£

NUnit×÷ΪxUnit¼Ò×åÖеÄ.Net³ÉÔ±£¬ÊÇ.NETµÄµ¥Ôª²âÊÔ¿ò¼Ü£¬xUnitÊÇÒ»Ì×ÊʺÏÓÚ¶àÖÖÓïÑԵĵ¥Ôª²âÊÔ¹¤¾ß¡£Ëü¾ßÓÐÈçÏÂÌØÕ÷£º

ÌṩÁËAPI£¬Ê¹µÃÎÒÃÇ¿ÉÒÔ´´½¨Ò»¸ö´øÓС°Í¨¹ý/ʧ°Ü¡±½á¹ûµÄÖØ¸´µ¥Ôª¡£

°üÀ¨ÁËÔËÐвâÊԺͱíʾ½á¹ûËùÐèµÄ¹¤¾ß¡£

ÔÊÐí¶à¸ö²âÊÔ×÷Ϊһ¸ö×éÔÚÒ»¸öÅú´¦ÀíÖÐÔËÐС£

·Ç³£ÁéÇÉ£¬²Ù×÷¼òµ¥£¬ÎÒÃÇ»¨·ÑºÜÉÙµÄʱ¼ä¼´¿Éѧ»á²¢ÇÒ²»»á¸ø²âÊԵijÌÐòÌí¼Ó¶îÍâµÄ¸ºµ£¡£

¹¦ÄÜ¿ÉÒÔÀ©Õ¹£¬Èç¹ûÏ£Íû¸ü¶àµÄ¹¦ÄÜ£¬¿ÉÒÔºÜÈÝÒ×µÄÀ©Õ¹Ëü¡£

Ì×ÓÃÀÏÂ޵ϰ¾ÍÊÇÒ»¾ä»°£ºËüÊǵ±½ñ.NETÁìÓò×îÅ£±ÆµÄ²âÊÔ¹¤¾ßÖ®Ò»

ÔÚ.NETϵĵ¥Ôª²âÊÔ¹¤¾ßÆäʵ·Ç³£¶à£¬ÕâÀï²»Ïë¶à˵£¬ÎÒÃǾÍʹÓÃ΢Èí×Ô¼ºÌṩµÄ²âÊÔ¿ò¼ÜUnit Test Framework£¬ÒѾ­¼¯³ÉÔÚvsÖÐÁË~

ËÄ¡¢MOQ

µ¥Ôª²âÊÔµÄÄ¿±êÊÇÒ»´ÎÖ»²âÊÔÒ»¸ö·½·¨£¬ÊÇÒ»ÖÖϸÁ£¶ÈµÄ²âÊÔ£¬µ«ÊǼÙÈçij¸ö·½·¨ÒÀÀµÓÚÆäËûһЩÄÑÒԲٿصÄÍⲿ¶«¶«£¬±ÈÈçËµÍøÂçÁ¬½Ó¡¢Êý¾Ý¿âÁ¬½ÓµÈʱ£¬ÄÇôÎÒÃǸÃÔõô°ìÄØ£¿¼ÈÈ»µ¥Ôª²âÊԵķ¨Ôò˵²»ÈÃÒÀÀµÕâЩ¸öÍâ²¿ÕæÊµµÄ¶«Î÷£¬ÄÇ»¹²»¼òµ¥£¬ÎÒɽկһ¸ö²»¾ÍÐÐÁËÂ𣿴Ëʱµ±²ÉÓÃÒÔ¼ÙÂÒÕæµÄÊÖ·¨À´Íê³Éµ¥Ôª²âÊÔ¡£Êµ¼ÊÉÏÎÒÃÇÕâÀï²ÉÓõÄÊÇMock¶ÔÏó£¬Ò²¾ÍÊÇÕæÊµ¶ÔÏóµÄÌæ´úÆ·£¬²¢Ê¹ÓÃMoq¿ò¼ÜÀ´Ä£ÄâMock¶ÔÏó£¬ËüΪÎÒÃÇÌṩÁËÄ£ÄâÕæÊµ¶ÔÏóÐÐΪµÄÄÜÁ¦£¬È»ºó½»¸ø±»²âÊÔ¹¦ÄÜʹÓã¬ÒÔ´ËÅжϱ»²âÊÔ¹¦ÄÜÊÇ·ñÕýÈ·¡£

×¢Ò⣺MoqÖ»ÄÜÄ£Äâ½Ó¿Ú»ò³éÏóÀà¡£

Äã¿ÉÒÔͨ¹ýNugetÀ´»ñÈ¡Moq²¢ÇÒÒýÓõ½Ö¸¶¨µÄÏîÄ¿£¬Ò²¿ÉÒÔÔÚgoogleÉÏÏÂÔØ£¬²»¹ÜÔõÑù¼ÇµÃÔÚ²âÊÔÏîÄ¿ÖÐÒýÓÃMoq.dll¾ÍÐÐ~

¾Ù¸öÀõ×Ó£º

public class Student
{
public string ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
IStudentRepository
public interface IStudentRepository
{
Student GetStudentById(string id);
}

ÏÂÃæÊÇ·½·¨GetStudentByIdµÄµ¥Ôª²âÊÔ´úÂ룺

[TestMethod]
public void GetStudentByIdTest()
{
//´´½¨MOCK¶ÔÏó
var mock = new Mock<IStudentRepository>();
//ÉèÖÃMOCKµ÷ÓÃÐÐΪ
mock.Setup(p=>p.GetStudentById("1")).Returns(new Student());
//MOCKµ÷Ó÷½·¨
mock.Object.GetStudentById("1");
Assert.AreNotSame(new Student(), mock.Object.GetStudentById("1"));
}

ÕâÀïÆäʵÒѾ­ÒÔ¼ÙÂÒÕæÁË£¬ÒòÎªÕæÊµµÄ½Ó¿ÚIStudentRepositoryÀï±ßµÄ·½·¨GetStudentByIdÔÚʵ¼ÊÖп϶¨ÒªÒª·ÃÎÊÊý¾Ý¿âµÄ£¬ÄÇôÎÒÃÇÕâÀïѹ¸ù¶¼Ã´ÓзÃÎÊʲôÊý¾Ý¿â£¬Ö±½ÓÓÃIStudentRepository½Ó¿ÚÄ£ÄâÁËÒ»¸ö¶ÔÏ󣬸ù±¾²»ÓÃʵÏÖ£¬ÕâÑù˲¼ä¾ÍÌá¸ßÁ˵¥Ôª²âÊԵĿÉÐÐÐÔ¡£²»¹ýÕâÀïÒ²ÒªÌá¸öÐÑ£¬¾ÍÊÇÔÚд´úÂëµÄʱºò£¬±ðÈôúÂë²úÉú¹ý¶ÈµÄÒÀÀµ£¬·½¿ÉÔÚ½øÐе¥Ôª²âÊÔʱ˳Àû½øÐУ¡

˵˵³£ÓõÄMoq³ÉÔ±£º

1¡¢Mock<T>£ºÍ¨¹ýÕâ¸öÀàÎÒÃÇÄܹ»µÃµ½Ò»¸öMock<T>¶ÔÏó£¬T¿ÉÒÔÊǽӿںÍÀà¡£ËüÓÐÒ»¸ö¹«¿ªµÄObjectÊôÐÔ£¬Õâ¸ö¾ÍÊÇÎÒÃÇMoqΪÎÒÃÇÄ£Äâ³öµÄ¶ÔÏó¡£

var mo = new Mock<IStudentRepository>();
¡¡¡¡mo.Object //Æäʵ¾ÍÊÇÄ£ÄâʵÏÖIStudentRepository½Ó¿ÚµÄ¶ÔÏó

2¡¢It£ºÕâÊÇÒ»¸ö¾²Ì¬À࣬ÓÃÓÚ¹ýÂ˲ÎÊý¡£

ItºÜÊʺÏÓÃÀ´Æ¥ÅäÊý×Ö£¬×Ö·û´®²ÎÊý£¬ËüÌṩÁËÈçϼ¸¸ö¾²Ì¬·½·¨£º

Is<TValue> £º²ÎÊýΪExpression<Predict<TValue>>ÀàÐÍ£¬µ±ÄãÐèҪijÖÖÀàÐͲ¢ÇÒÕâÖÖÀàÐÍҪͨ¹ý´úÂëÀ´Åжϵϰ¿ÉÒÔʹÓÃËü¡£

IsAny<TValue> £ºÃ»ÓвÎÊý£¬Ö»ÒªÊÇTValueÀàÐ͵ľÍÄÜÆ¥Åä³É¹¦¡£

IsInRange<TValue> £ºÓÃÀ´Æ¥ÅäÁ½¸öµÄTValueÀàÐÍÖµÖ®¼äµÄ²ÎÊý¡££¨Range²ÎÊý¿ÉÒÔÉ趨¿ª±ÕÇø¼ä£©

IsRegex£ºÓÃÕýÔò±í´ïʽƥÅä¡££¨½öÏÞÓÚ×Ö·û´®ÀàÐͲÎÊý£©

var customer = new Mock<ICustomer>();

customer.Setup(x => x.SelfMatch(It.Is<int>(i => i % 2 == 0))).Returns("1");//·½·¨SelfMatch½ÓÊÜintÐͲÎÊý£¬µ±²ÎÊýΪżÊýʱ£¬²Å·µ»Ø×Ö·û´®1¡£

customer.Setup(p => p.SelfMatch(It.IsAny<int>())).Returns((int k) => "ÈκÎÊý£º" + k);//·½·¨SelfMatch½ÓÊÜintÐÍ£¬ÇÒÈκÎintÐͲÎÊý¶¼¿ÉÒÔ£¬È»ºó·µ»Ø£º"ÈκÎÊý£º" + k¡£

customer.Setup(p => p.SelfMatch(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns("10ÒÔÄÚµÄÊý");//·½·¨SelfMatch½ÓÊÜintÐÍ£¬ÇÒµ±·¶Î§ÔÚ[0,10]ʱ£¬²Å·µ»Ø10ÒÔÄÚµÄÊý

customer.Setup(p => p.ShowException(It.IsRegex(@"^\d+$"))).Throws(new Exception("²»ÄÜÊÇÊý×Ö"));//ÓÃÕýÔò±í´ïʽ¹ýÂ˲ÎÊý²»ÄÜÊÇÊý×Ö

3¡¢MockBehavior£ºÓÃÓÚÅäÖÃMockObjectµÄÐÐΪ£¬±ÈÈçÊÇ·ñ×Ô¶¯mock¡£

MoqÓиöö¾ÙÀàÐÍMockBehavior£¬ÓÐÈý¸öÖµStrict£¬Loose£¬Default¡£

Strict±íʾMock¶ÔÏóÔÚµ÷ÓÃÒ»¸ö·½·¨Ç°Õâ¸ö·½·¨±ØÐë±»Mockµô£¬·ñÔò¾Í»áÒý·¢MockException¡£¶øLooseÓëÖ®Ïà·´£¬Èç¹ûµ÷ÓÃûÓÐMockµÄ·½·¨Ò²²»»á³ö´í¡£DefaultĬÈÏΪLoose¡£ÀýÈ磺

[TestMethod]
public void MoqTest()
{
var mo = new Mock<ICustomer>(MockBehavior.Strict);
mo.Object.Method();//ÔÚMockBehavior.StrictÉèÖÃÏ£¬Ò»Çе÷ÓÃδÌî³äµÄ·½·¨/ÊôÐÔ/ʼþʱ»áÅ׳öÒì³£
}

4¡¢MockFactory£ºMock¶ÔÏ󹤳§£¬Äܹ»ÅúÁ¿Éú²úͳһ×Ô¶¨ÒåÅäÖõÄMock¶ÔÏó£¬Ò²ÄÜÅúÁ¿µÄ½øÐÐMock¶ÔÏó²âÊÔ¡£

ÕâÊÇÒ»¸öÄ£Äâ¶ÔÏóµÄ¹¤³§£¬ÎÒÃDz»¿ÉÒÔ³ÉÅúMockËüÃÇ£¬ÀýÈ磺

var factory = new MockFactory(MockBehavior.Strict) { DefaultValue = DefaultValue.Mock };
// Create a mock using the factory settings
var aMock = factory.Create<IStudent>();
// Create a mock overriding the factory settings
var bMock = factory.Create<ITeacher>(MockBehavior.Loose);
// Verify all verifiable expectations on all mocks created through the factory
factory.Verify();

5¡¢Match<T>£ºÈç¹ûÄãÏȾõµÃIt²»¹»ÓþÍÓÃMatch<T>£¬Í¨¹ýËüÄܹ»ÍêÈ«×Ô¶¨Ò广Ôò¡£

»¹ÊǾٸöÀõ×ӱȽÏÄÜ˵Ã÷ÎÊÌâ

[TestMethod()]
public void MoqTest()
{
var mo = new Mock<IRepository>();
mo.Setup(p => p.Method(MatchHelper.ParamMatcher("wang"))).Returns("success");
Assert.AreEqual(mo.Object.("wang"), ¡°success);
}
//´Ë´¦¾ÍʵÏÖÁË×Ô¶¨ÒåµÄ²ÎÊýÆ¥Åä
public static class MatchHelper
{
public static string ParamMatcher(string name)
{
return Match<string>.Create(
p => p.Equals(name));
}
}

6¡¢VerifyºÍVerifyAll

ÓÃÓÚ²âÊÔmock¶ÔÏóµÄ·½·¨»òÊôÐÔÊÇ·ñ±»µ÷ÓÃÖ´ÐУ¬Verify±ØÐëÒªÏȵ÷ÓÃVerifiable()·½·¨²ÅÄÜÓ㬶øVerifyAll²»ÓÃÕâÑù¾Í¿ÉÒÔ¶ÔËùÓеÄmock¶ÔÏó½øÐÐÑéÖ¤£¬ÀýÈ磺

public void TestVerify()
{
var customer = new Mock<ICustomer>();
customer.Setup(p => p.GetCall(It.IsAny<string>()))
.Returns("·½·¨µ÷ÓÃ").Verifiable();//±ØÐëµ÷ÓÃVerifiable()·½·¨²Å¿ÉÒÔ
customer.Object.GetCall("µ÷ÓÃÁË£¡");
customer.Verify();
}
public void TestVerifyAll()
{
var customer = new Mock<ICustomer>();
customer.Setup(p => p.GetCall(It.IsAny<string>()))
.Returns("·½·¨µ÷ÓÃ"); //ûÓÐÏÔʽµ÷ÓÃVerifiable()·½·¨Ò²¿ÉÒÔ
customer.Object.GetCall("µ÷ÓÃÁË£¡");
customer.VerifyAll();
}

7¡¢Callback

Æäʵ¾ÍÊǻص÷£¬Ê¹ÓÃCallback¿ÉÒÔʹÎÒÃÇÔÚij¸öʹÓÃÌØ¶¨²ÎÊýÆ¥ÅäµÄ·½·¨ÔÚ±»µ÷ÓÃʱµÃµ½Í¨Öª¡£µ±Ö´ÐÐij·½·¨Ê±£¬µ÷ÓÃÆäÄÚ²¿ÊäÈëµÄ£¨Action£©Î¯ÍУ¬ÀýÈ磺

public void TestCallback()
{
var customer = new Mock<ICustomer>();
customer.Setup(p => p.GetCall(It.IsAny<string>()))
.Returns("·½·¨µ÷ÓÃ")
.Callback((string s)=>Console.WriteLine("ok"+s));
customer.Object.GetCall("x");
}

Îå¡¢ASP.NET MVCµ¥Ôª²âÊÔÓ¦ÓÃ

¼¸µã½¨Ò飺

1¡¢Ã¿µ±ÄãÏòcontroller¡¢service¡¢repository²ãÖÐÌí¼ÓһϵÁеÄк¯Êýʱ£¬´ÓÄ㿪ʼÐ޸ĴúÂëµÄÄÇÒ»¿Ì¿ªÊ¼£¬Äã¾Í±ØÐëµÃ³Ðµ£ÓпÉÄÜÆÆ»µÔ­±¾Õý³£¹¤×÷µÄÄDz¿·Ö¹¦ÄܵķçÏÕ¡£ÑÔÍâÖ®Ò⣬Äã±ØÐë½øÐе¥Ôª²âÊÔ²ÅÐС£

2¡¢µ¥Ôª²âÊÔ±ØÐëÊÇ¿ÉÒÔ¿ìËÙÖ´Ðеġ£Òò´Ë¶ÔÓÚºÄʱµÄÊý¾Ý¿â½»»¥À´Ëµ£¬Äã±ØÐë¶ÔÆä½øÐÐmock£¬È»ºó±àд´úÂëÓëmockµÄÊý¾Ý¿â½øÐн»»¥

3¡¢Äã²»±ØÎªview½øÐе¥Ôª²âÊÔ¡£ÒòΪҪÏë¶Ôview½øÐвâÊÔ£¬Äã¾Í²»µÃ²»´î½¨web·þÎñÆ÷¡£ÒòΪ´î½¨web·þÎñÆ÷Ïà¶ÔÀ´ËµºÜºÄʱ£¬Òò´Ë²¢²»ÍƼöÕë¶Ôview½øÐе¥Ôª²âÊÔ¡£ Èç¹ûÄãµÄview°üº¬´óÁ¿¸´ÔÓµÄÂß¼­£¬ÔòÄãÓ¦µ±¿¼Âǽ«ÕâЩÂß¼­×ªÒƵ½Helper·½·¨ÖС£Äã¿ÉÒÔÕë¶ÔHelper·½·¨±àдµ¥Ôª²âÊÔÇÒÎÞÐè´î½¨web·þÎñÆ÷¡£

4¡¢¶ÔÓÚÉæ¼°µ½httpµÄ¶«¶«£¬ÄãÒ²±ØÐëmockÒ»ÏÂ

ÈçºÎΪ·½·¨Ìí¼Óµ¥Ôª²âÊÔ£¿

1¡¢ÔÚн¨MVCÏîĿʱΪÏîÄ¿Ìí¼ÓĬÈϵĵ¥Ôª²âÊÔÏîÄ¿£¬ÈçͼËùʾ£º

2¡¢»òÕßÔÚvsÖÐÏàÓ¦µÄ·½·¨´¦µ¥»÷Êó±êÓÒ¼ü£¬Ìí¼Óµ¥Ôª²âÊÔ¼´¿É£¬ÈçͼËùʾ£º

MVCµ¥Ôª²âÊÔ

ĬÈÏÉú³ÉµÄµ¥Ôª²âÊÔ´úÂëÒѾ­ÎªControllerÉú³ÉÁËÏàÓ¦µÄµ¥Ôª²âÊÔ·½·¨£¬ÀýÈç¶ÔHomeController½øÐе¥Ôª²âÊÔ£¬×¢Òâ²âÊÔÀàµÄÃüÃû¹æ·¶£¬ÒÔ¼°Á½¸öÌØÐÔTestClassºÍTestMethod£¬ÓÐÁËÕâÁ½¸ö¶«¶«£¬·½¿É¶ÔÀàºÍ·½·¨½øÐвâÊÔ¡£ÎÒÃÇ¿ÉÒÔ·¢ÏÖÊǰ´ÕÕarrange/act/assertµÄģʽÀ´½øÐе¥Ôª²âÊԵ쬵¥Ôª²âÊÔ˵°×Á˾ÍÊÇÈý²½×ߣºarrange£º³õʼ»¯²âÊԵĻ·¾³ÊôÓÚ×¼±¸½×¶Î£»act£ºÖ´ÐвâÊÔ£»assert£º¶ÏÑÔ£¬²âÊԵĽá¹û

[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void About()
{
// Arrange
HomeController controller = new HomeController();
// Act
ViewResult result = controller.About() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
}

ÄѵãÆäʵÔÚµÚÒ»²½£¬¾ÍÊDzâÊÔ»·¾³µÄ×¼±¸£¬ÕâÀï¸ü¶àµÄÊÇÓÃMoqÀ´½øÐÐÄ£Äâ¡£ÁíÍâ£¬Éæ¼°µ½µÄAssertÀàÖ÷ÒªÓÐÒÔÏÂÕâЩ·½·¨

Assert.Inconclusive() ±íʾһ¸öδÑéÖ¤µÄ²âÊÔ£»

Assert.AreEqual() ²âÊÔÖ¸¶¨µÄÖµÊÇ·ñÏàµÈ£¬Èç¹ûÏàµÈ£¬Ôò²âÊÔͨ¹ý£»

AreSame() ÓÃÓÚÑéÖ¤Ö¸¶¨µÄÁ½¸ö¶ÔÏó±äÁ¿ÊÇÖ¸ÏòÏàͬµÄ¶ÔÏ󣬷ñÔòÈÏΪÊÇ´íÎó

AreNotSame() ÓÃÓÚÑéÖ¤Ö¸¶¨µÄÁ½¸ö¶ÔÏó±äÁ¿ÊÇÖ¸Ïò²»Í¬µÄ¶ÔÏ󣬷ñÔòÈÏΪÊÇ´íÎó

Assert.IsTrue() ²âÊÔÖ¸¶¨µÄÌõ¼þÊÇ·ñΪTrue£¬Èç¹ûΪTrue£¬Ôò²âÊÔͨ¹ý£»

Assert.IsFalse() ²âÊÔÖ¸¶¨µÄÌõ¼þÊÇ·ñΪFalse£¬Èç¹ûΪFalse£¬Ôò²âÊÔͨ¹ý£»

Assert.IsNull() ²âÊÔÖ¸¶¨µÄ¶ÔÏóÊÇ·ñΪ¿ÕÒýÓã¬Èç¹ûΪ¿Õ£¬Ôò²âÊÔͨ¹ý£»

Assert.IsNotNull() ²âÊÔÖ¸¶¨µÄ¶ÔÏóÊÇ·ñΪ·Ç¿Õ£¬Èç¹û²»Îª¿Õ£¬Ôò²âÊÔͨ¹ý£»

Ò»¸öÄ£Äâ·ÃÎÊService·þÎñµÄµ¥Ôª²âÊÔÀõ×Ó£º

namespace Mvc4UnitTesting.Tests.Controllers
{
[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void Index()
{
// Arrange
var mockIProductService = new Mock<IProductService>();
mockIProductService.Setup(p => p.GetAllProduct()).Returns(new List<Product> { new Product{ ProductId = 1, ProductName = "APPLE", Price = "5999"}});
HomeController controller = new HomeController(mockIProductService.Object);
// Act
ViewResult result = controller.Index() as ViewResult;
var product = (List<Product>)result.ViewData.Model;
// Assert
Assert.AreEqual("APPLE", product.First<Product>().ProductName);
}
}
}

Ò»¸öÄ£Äâ·ÃÎÊWeb»·¾³µÄµ¥Ôª²âÊÔÀõ×Ó£º

public ActionResult Index()
{
ViewData["Message"] = Request.QueryString["WW"];
return View();
}
[TestMethod]
public void Index()
{
HomeController controller = new HomeController();
var httpContext = new Mock<HttpContextBase>();
var request=new Mock<HttpRequestBase>();
NameValueCollection queryString = new NameValueCollection();
queryString.Add("WW", "WW");
request.Setup(r => r.QueryString).Returns(queryString);
httpContext.Setup(ht => ht.Request).Returns(request.Object);
ControllerContext controllerContext = new ControllerContext();
controllerContext.HttpContext = httpContext.Object;
controller.ControllerContext = controllerContext;
ViewResult result = controller.Index() as ViewResult;
ViewDataDictionary viewData = result.ViewData;
Assert.AreEqual("WW", viewData["Message"]);
}

×ܽ᣺

ÓÐЧµÄ²âÊÔÊÇÈí¼þÖÊÁ¿µÄ±£Ö¤£¬ËùÒÔÕâÀïÏ£Íû´ó¼Ò£¬°üÀ¨±¾ÈË×Ô¼ºÔÚÄÚ£¬¶¼Äܹ»°Ñµ¥Ôª²âÊÔÂ䵽ʵ´¦£¬Ä¿Ç°¶ÔÓÚÎÒÃÇÀ´Ëµ£¬×î´óµÄÄѵãÔÚÓÚÄÜ·ñÇ¡µ½ºÃ´¦µØÄ£Äâ³öÏà¹ØµÄÒÀÀµ×ÊÔ´£¬Òò´Ëд³öµÍñîºÏµÄ´úÂë¾Í±äµÃºÜÓбØÒª¡£Æäʵ¶à¼ÓÁ·Ï°Ê¹ÓÃÖ®ºó£¬×ÔÈ»¾ÍÄܹ»Ó¦¶ÔÏà¶Ô¸´Ôӵĵ¥Ôª²âÊÔ£¬ÖÕÓÐÒ»ÌìÄã»á·¢ÏÖ£¬µ¥Î»²âÊÔÖ»²»¹ýÊÇ·Ö·ÖÖÓµÄÊ£¡

   
4321 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

LoadRunnerÐÔÄܲâÊÔ»ù´¡
Èí¼þ²âÊÔ½á¹û·ÖÎöºÍÖÊÁ¿±¨¸æ
ÃæÏò¶ÔÏóÈí¼þ²âÊÔ¼¼ÊõÑо¿
Éè¼Æ²âÊÔÓÃÀýµÄËÄÌõÔ­Ôò
¹¦ÄܲâÊÔÖйÊÕÏÄ£Ð͵Ľ¨Á¢
ÐÔÄܲâÊÔ×ÛÊö


ÐÔÄܲâÊÔ·½·¨Óë¼¼Êõ
²âÊÔ¹ý³ÌÓëÍŶӹÜÀí
LoadRunner½øÐÐÐÔÄܲâÊÔ
WEBÓ¦ÓõÄÈí¼þ²âÊÔ
ÊÖ»úÈí¼þ²âÊÔ
°×ºÐ²âÊÔ·½·¨Óë¼¼Êõ


ij²©²ÊÐÐÒµ Êý¾Ý¿â×Ô¶¯»¯²âÊÔ
IT·þÎñÉÌ Web°²È«²âÊÔ
IT·þÎñÉÌ ×Ô¶¯»¯²âÊÔ¿ò¼Ü
º£º½¹É·Ý µ¥Ôª²âÊÔ¡¢Öع¹
²âÊÔÐèÇó·ÖÎöÓë²âÊÔÓÃÀý·ÖÎö
»¥ÁªÍøweb²âÊÔ·½·¨Óëʵ¼ù
»ùÓÚSeleniumµÄWeb×Ô¶¯»¯²âÊÔ