
äŸãšããŠãMSTestã®éåžžã®ã¿ã€ãã®ãã¹ãããSpecFlowã®ãã¹ãã«äœãçŽãããã¹ãã瀺ããŸãã
ãœãŒã¹ãã¹ã
[TestMethod] public void CreatePluralName_SucceedsOnSamples() { // setup var target = new NameCreator(); var pluralSamples = new Dictionary<string, string> { { "ballista", "ballistae" }, { "class", "classes"}, { "box", "boxes" }, { "byte", "bytes" }, { "bolt", "bolts" }, { "fish", "fishes" }, { "guy", "guys" }, { "ply", "plies" } }; foreach (var sample in pluralSamples) { // act var result = target.CreatePluralName(sample.Key); // verify Assert.AreEqual(sample.Value, result); } }
SpecFlowã§ãã¹ããã
Feature: PluralNameCreation In order to assign names to Collection type of Navigation Properties I want to convert a singular name to a plural name @PluralName Scenario Outline: Create a plural name Given I have a 'Name' defined as '<name>' When I convert 'Name' to plural 'Result' Then 'Result' should be equal to '<result>' Examples: | name | result | | ballista | ballistae | | class | classes | | box | boxes | | byte | bytes | | bolt | bolts | | fish | fishes | | guy | guys | | ply | plies |
å€å žçãªã¢ãããŒã
äžèšã®äŸã¯ããã®èšäºã§èª¬æããã代æ¿ã¢ãããŒãã«ã¯é©çšããããå€å žçãªã¢ãããŒããåç §ããŸãã ãã®éåžžã«å€å žçãªã¢ãããŒãã§ã¯ããã¹ãã®ãå ¥åãããŒã¿ã¯ãã¹ãèªäœã§ç¹å¥ã«äœæãããŸãã ãã®ãã¬ãŒãºã¯ãã代æ¿æ§ãã®æ§æèŠçŽ ã§ãããã³ããšããŠãã§ã«åœ¹ç«ã¡ãŸãã
ãã¹ãçšã®ããŒã¿ã®å€å žçãªäœæã®ããå°ãè€éãªäŸã§ã¯ã代æ¿æ¡ãæ¯èŒã§ããŸãïŒ
Given that I have a insurance created in year 2006 And insurance has an assignment with type 'Dependent' and over 70 people covered
ã³ãŒãã®ãã次ã®è¡ã¯ããã®ãããªè¡ã«å¯Ÿå¿ããŠããŸããããã以äžã®ã¹ããããšåŒã³ãŸãã
insurance = new Insurance { Created = new DateTime(2006, 1, 2), Assignments = new List<Assignment>() }; insurance.Assignments.Add(new Assignment { Type = assignmentType, HeadCount = headCount + 1 });
ãŸãããã¹ãã¹ãããã®å®çŸ©ã«ã¯ããããã®ãªããžã§ã¯ããã¹ãããéã§è»¢éã§ããã³ãŒãããããŸãããç°¡æœã«ããããã«ããã®ã³ãŒãã¯çç¥ãããŠããŸãã
代æ¿æ¡
ãã®ã¢ãããŒãã¯ãç§ã§ã¯ãªãååã«ãã£ãŠçºèŠãããé©çšãããããšãããã«è¿°ã¹ãããšæããŸãã ãããšgithubã§ã圌ã¯gerichhomeãšããŠç»é²ãããŠããŸã ã ç§ã¯ããã説æãå ¬éããããšãçŽæããŸããã ãŸããå€åãhabrã®äŒçµ±ã«ããã°ãèšäºãããæçšãªã³ã¡ã³ãã衚瀺ãããŸããã圌ãæžããŠæéãç¡é§ã«ããã®ã¯ç¡é§ã§ã¯ãªãã£ãããšãããããŸãã
ãããžã§ã¯ãã®å Žåã®ããã«ãå Žåã«ãã£ãŠã¯ãããŒã¿ã«ããŒãžã衚瀺ããããã«å€§éã®ããŒã¿ãå¿ èŠã«ãªããŸãã ãŸããç¹å®ã®æ©èœããã¹ãããããã«å¿ èŠãªã®ã¯ããäžéšã§ãã ãããŠãããŒãžã®æ®ãã®éšåãããŒã¿ã®äžè¶³ããèœã¡ãªãããã«ãããªãã®éã®ã³ãŒããæžãå¿ èŠããããŸãã ããã«æªãããšã«ãSpecFlowã¹ããããããã€ãèšè¿°ããå¿ èŠããããŸãã ãã®ããã«ãããªãã¯æããæãŸãªããšããããšãå€æããŸãããçŸæç¹ã§ã¯å¿ èŠãªéšåã§ã¯ãªããããŒãžå šäœããã¹ãããå¿ èŠããããŸãã
ãããŠãããåé¿ããããã«ãããŒã¿ãäœæããããšã¯ã§ããŸããããå©çšå¯èœãªãã®ã®äžããæ€çŽ¢ããŸãã ããŒã¿ã¯ããã¹ãããŒã¿ããŒã¹ããŸãã¯äžéšã®APIã®ã¹ã©ã€ã¹ã§åéããã³ã·ãªã¢ã«åãããã¢ãã¯ãã¡ã€ã«ã«ãããŸãã ãã¡ããããã®ã¢ãããŒãã¯ãå€ãã®æ©èœãå°ãªããšããã®ããŒã¿ãæäœã§ããéšåãæ¢ã«ããå Žåã«ããé©ããŠããŸãã ãã®ããããã¹ãã«å¿ èŠãªããŒã¿ã»ããããªãå Žåã¯ãæåã«ãæåãã§ãã¹ãã¹ã¯ãªãããå®è¡ããããŒã¿ããã£ã¹ãããŠããèªååã§ããŸãã æ¢åã®ã³ãŒãããã¹ãã§ã«ããŒããå¿ èŠãããå Žåãããã³/ãŸãã¯å¿ èŠãªå Žåã«ãã®ã¢ãããŒãã䜿çšãããšäŸ¿å©ã§ãããªãã¡ã¯ã¿ãªã³ã°/ãªã©ã€ã/æ¡åŒµããæ©èœãå£ããããšãæããªãã§ãã ããã
åãšåæ§ã«ããã®ãã¹ãã«ã¯ã2006幎ã«äœæãããDependentã¿ã€ãã®å²ãåœãŠãš70人以äžã®å¯Ÿè±¡äººæ°ãæã€Insuranceãªããžã§ã¯ããå¿ èŠã§ãã ããŒã¿ããŒã¹ã«ä¿åãããŠããä¿éºã«ã¯ä»ã«ãå€ãã®ãšã³ãã£ãã£ãå«ãŸããŠããããããžã§ã¯ãã§ã¯ã¢ãã«ã20以äžã®ããŒãã«ãå æããŠããŸããã ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®äžç°ãšããŠãå®å šãªã¢ãã«ã䜿çšãããåçŽåããã¢ãã«ã«ã¯3ã€ã®ãšã³ãã£ãã£ã®ã¿ãå«ãŸããŠããŸãã
é©åãªä¿éºãèŠã€ããã«ã¯ãäœããã®æ¹æ³ã§IEnumerable <Insurance>ã®åœ¢åŒã§ãœãŒã¹ãç¹å®ããã¹ãããã®å®çŸ©ã次ã®ããã«å€æŽããå¿ èŠããããŸãã
insurances = insurances.Where(x => x.Created.Year == year); insurances = insurances.Where(x => x.Assignments.Any(y => y.Type == assignmentType && y.HeadCount > headCount));
次ã«ã次ã®æé ã§ãããŒã¿ã«ãéããHTTPèŠæ±è¡ã§æåã«èŠã€ãã£ãä¿éºã®IDãæž¡ããŠãå¿ èŠãªæ©èœãå®éã«ãã¹ãããå¿ èŠããããŸãã ãã¡ããããããã®ã¢ã¯ã·ã§ã³ã®è©³çŽ°ã¯ããã®ãããã¯ã®ç¯å²ãã¯ããã«è¶ ããŠããŸãã
æ€çŽ¢ã¢ã«ãŽãªãºã
ä¿éºãèŠã€ãã£ãã®ã§ãããŒã¿ã«ãéããŠãUIã®ç®çã®ã»ã¯ã·ã§ã³ã«ä¿éºã®ååã衚瀺ãããŠããããšã確èªããä»åºŠã¯ä»ã®ã»ã¯ã·ã§ã³ã«å¿ èŠãªäŸåè ã®æ°ã衚瀺ãããŠããããšã確èªããå¿ èŠããããŸãã ããã§åé¡ãçºçããŸããããã®ã¹ãããã§ãã©ã®å²ãåœãŠã«ãã£ãŠä¿éºããã®æ¡ä»¶ãæºãããŠããããæ£ç¢ºã«èª¿ã¹ãã«ã¯ã©ãããã°ããã§ããïŒ ããšãã°ãHeadCountãUIã®æ°ãšæ¯èŒããããã«5ã€ã®ãã¡ã©ãã䜿çšããå¿ èŠããããŸããïŒ
ãããè¡ãã«ã¯ããThenãã¹ãããã§ãã®æ¡ä»¶ãç¹°ãè¿ãå¿ èŠããããã³ãŒãã®è€è£œã¯æããã«æªãã§ãã ããã«ãæ¡ä»¶ã®è€è£œãSpecFlowã®ã¹ãããå ã«ããå¿ èŠããããŸãããããã¯ãŸã£ããåãå ¥ããããŸããã
åæ çãªäœè«-ãããžã§ã¯ãã®1ã€ã§åæ§ã®ããšãæ¢ã«ãããŸãããSSNãªã¹ããè¿ãããšã§äººã ãæ¢ããŠããSQLã¯ãšãªããããŸããïŒç°¡åã«ããããã«ãconfigããååŸããŸãïŒã ã·ããªãªã«ãããšããããã®äººã ã¯18æ³ä»¥äžã®åäŸãç£ãå¿ èŠããããŸããã ãããŠããžãã¹ã®äººã ã¯é·ãéè°è«ããã»ãšãã©åªããç¹å®ã®äººãæ¡ä»¶ãæºãããåäŸãèŠã€ããããã«ãã®ãªã¯ãšã¹ããå解ã§ããªãçç±ãç解ã§ããŸããã§ããã 圌ãã¯ããªã2çªç®ã®ãªã¯ãšã¹ããå¿ èŠãªã®ãç解ã§ããŸããã§ããã ãããŠãBAããã¹ãã®ããã¹ããæžãããæããæªæ¥ã®ã¢ã€ãã¢ãããã®ã§ãã¹ãããã§è€è£œãå¿ èŠãªçç±ã説æããããšã¯ããã®è€è£œãæé€ãããããã¯ããã«é£ãããããã¯æ€çŽ¢ã¢ã«ãŽãªãºã ã«ãã£ãŠè§£æ±ºãããæåã®ã¿ã¹ã¯ã§ãã
ãŸããåã®æ®µèœã§èª¬æããéåžžã®æ€çŽ¢ã§ã¯ã2çªç®ã®ã¹ãããã2ã€ã®SpecFlowã¹ãããã«åå²ããããšã¯ã§ããŸããã ããã¯ãã¢ã«ãŽãªãºã ã«ãã£ãŠè§£æ±ºããã2çªç®ã®åé¡ã§ãã ãã®ã¢ã«ãŽãªãºã ãšãã®å®è£ ã«ã€ããŠè©³ãã説æããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ã次ã®å³ã«æŠç¥çã«ç€ºãããŠããŸãã

æ€çŽ¢ã¯éåžžã«ç°¡åã§ãã ã«ãŒããšã³ãã£ãã£ã®å ã®ã³ã¬ã¯ã·ã§ã³ïŒãã®å Žåã¯ä¿éºïŒã¯ãIEnumerable <IResolutionContext <Insurance >>ãšããŠè¡šãããŸãã èªèº«ã®æ¡ä»¶ãæºãããæ¡ä»¶ãæºãããåäŒç€Ÿã®ã³ã¬ã¯ã·ã§ã³ãæã€ä¿éºã®ã¿ãããã«è©²åœããŸãã ãããã®åãšã³ãã£ãã£ãæå®ããã«ã¯ããããã Func <T1ãIEnumerable <T2 >>åã®ã©ã ããæã€ãããã€ããŒã
åã³ã¬ã¯ã·ã§ã³ã«ãæ¡ä»¶ãããããã®äžã§æãåçŽãªãã®ã¯Existsã§ãã ãã®ãããªæ¡ä»¶ã§ã¯ãã³ã¬ã¯ã·ã§ã³ãèªèº«ã®æ¡ä»¶ãæºããå°ãªããšã1ã€ã®èŠçŽ ãæã£ãŠããå Žåãã³ã¬ã¯ã·ã§ã³ã¯æå¹ãšèŠãªãããŸãã
åçŽãªå Žåãç¬èªã®æ¡ä»¶ã¯ãã£ã«ã¿ãŒã§ãããã¿ã€ãFunc <T1ãbool>ã®ã©ã ãã§ãã
ãã®å³ã¯ããã¹ãŠã®æ¡ä»¶ã«é©åãã2ã€ã®ä¿éºãèŠã€ãã£ãå Žåã瀺ããŠããŸããæåã®ä¿éºã«ã¯ãæ¡ä»¶4ã«é©ããäžå®æ°ã®Assignmentãªããžã§ã¯ããšã2ã€ãåºãŠããäžå®æ°ã®Taxãªããžã§ã¯ãããããŸãã ãŸãã2çªç®ã®ä¿éºã«ã¯ã3ã€ã®é©åãªå²ãåœãŠãš4ã€ã®çšããããŸããã
ãããŠãããã¯ããªãæçœã«æããŸãããèªåã®æ¡ä»¶ã«åããªãã£ãä¿éºã«å ããŠããªã¹ãã«ã¯é©åãªå²ãåœãŠãªããžã§ã¯ããèŠã€ããããªãã£ãããŸãã¯é©åãªçšãªããžã§ã¯ããèŠã€ããªãã£ãä¿éºãå«ãŸããŠããŸããã
èµ€ãç¢å°ã¯ãç¹å®ã®èŠçŽ ã®çžäºäœçšã®ããªãŒã瀺ããŠããŸãã ç¹å®ã®AssignmentèŠçŽ ã«ã¯ãæäžéšãžã®æ¥ç¶ã1ã€ã ãããããããçæããç¹å®ã®InsuranceèŠçŽ ã«ã€ããŠã®ã¿ãèªèãããèŠçŽ ãé 眮ãããŠããAssignmentsã³ã¬ã¯ã·ã§ã³ã«ã€ããŠããããã«ãInsurancesã³ã¬ã¯ã·ã§ã³ã«ã€ããŠããèªèãããŸããã芪èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãååšããå ŽåããããŸãã
ãããããNuGetã§éçºããã³å ¬éããå®è£ ã®äœ¿çšã«é¢ãã説æãšäŸãèŠã€ããŸãïŒæåŸã®ãªã³ã¯ïŒã ååãæ€çŽ¢ã¢ã«ãŽãªãºã ã®ç¬èªã®å®è£ ãäœæããŸãããããã¯äž»ã«ãç»é²ãããã¯ãŒã¯ããã§ãŒã³ãã€ãŸãåäžã®ãã©ã³ããæã€ããªãŒã«åŒã蟌ããšããç¹ã§ç°ãªããŸãã ãã®å®è£ ã«ã¯ãç§ãæã£ãŠããªãããã€ãã®æ©èœãšãç¬èªã®æ¬ ç¹ããããŸãã ãŸãããã®å®è£ ã«ã¯ããã€ãã®äžå¿ èŠãªäŸåé¢ä¿ãããããããã¯å¥åã®ã¢ãžã¥ãŒã«ã§ã®æ±ºå®ããããã«åŠšå®³ããŸãã ããã«ãã«ãŒãã£ã³ã°ã¯æ¿æ²»çãªçç±ã§ãã«ãŒãã£ã³ã°ã¯å人çãªçç±ã§æãã圌ã®æ±ºå®ãå ¬è¡šããããšã«ç¹ã«ç±å¿ã§ã¯ãªããããã¯ä»ã®ãããžã§ã¯ãã§åœŒã䜿çšããããšãããããé£ããããŸãã èªç±æéãšãèå³æ·±ãã¢ã«ãŽãªãºã ãå®è£ ããããšããåžæããããŸããã äžç·ã«ãã®èšäºãæžãã«è¡ããŸããã
ãšã³ãã£ãã£ãšãã£ã«ã¿ãŒã®ç»é²
æ倧ã®ç²åºŠãå®çŸããããã«ãæé ã¯æ¬¡ã®ããã«åå²ãããŠããŸãã
Given insurance A is taken from insurancesSource #1 And insurance A is created in year 2007 #2 And for insurance A exists an assignment A #3 And assignment A has type 'Dependent' #4 And assignment A has over 70 people covered #5
ãã¡ããããã®ãããªç²åºŠã¯å€å°åé·ã«èŠãããããããŸããããäžæ¹ã§ãéåžžã«é«ãã¬ãã«ã®åå©çšãéæããããšãã§ããŸãã 5ã6åã®ãã¹ããèšè¿°ããæ€çŽ¢ã¢ã«ãŽãªãºã ã®ãã¹ããäœæããå Žåã次ã®ãã¹ãŠã®ãã¹ãã¯4åã®3ãåå©çšãããã¹ãããã§æ§æãããŠããŸããã
次ã®æ§æã¯ããã®ãããªãœãŒã¹ãšãã£ã«ã¿ãŒãç»é²ããããã«äœ¿çšãããŸãã
context.Register() .Items(key, () => InsurancesSource.Insurances); #1 context.Register() .For<Insurance>(key) .IsTrue(insurance => insurance.Created.Year == year); #2 context.Register() .For<Insurance>(insuranceKey) .Exists(assignmentKey, insurance => insurance.Assignments); #3 context.Register() .For<Assignment>(key) .IsTrue(assignment => assignment.Type == type); #4 context.Register() .For<Assignment>(key) .IsTrue(assignment => assignment.HeadCount >= headCount); #5
ããã§äœ¿çšãããã³ã³ããã¹ãã¯ãå®çŸ©ãå«ãã¯ã©ã¹ã«æ³šå ¥ãããïŒTestingContextã³ã³ããã¹ãïŒã§ãã SpecFlowããã¹ãã®ãã¹ãŠã®è¡ã«ã¯ãå®çŸ©ãžã®æºæ ã瀺ãããã«ã®ã¿çªå·ãä»ããããŠããŸãããããã®è¡ã®é åºã¯ä»»æã§ãã ããã¯ããèæ¯ãæ©èœã䜿çšãããšãã«åœ¹ç«ã¡ãŸãã ãã®ç»é²ã®èªç±ã¯ããããã€ããŒããªãŒãç»é²èªäœã§ã¯ãªããçµæã®æåã®åä¿¡æã«æ§ç¯ããããšããäºå®ã«ããå®çŸãããŸãã
æ€çŽ¢çµæã®ååŸ
var insurance = context.Value<Insurance>(insuranceKey); var insurances = context.All<Insurance>(insuranceKey); var assignments = context.All<Assignment>(assignmentKey);
æåã®è¡ã¯ããã¹ãŠã®æ¡ä»¶ã«äžèŽããæåã®ããªã·ãŒãè¿ããŸãã 2007幎ã«äœæããã70人ãããå°ãªããšã1ã€ã®äŸååå²ãåœãŠããããŸãã
2è¡ç®ã¯ããããã®æ¡ä»¶ãæºãããã¹ãŠã®ããªã·ãŒãè¿ããŸãã
3è¡ç®ã¯ãäžèŽããããªã·ãŒããäžèŽãããã¹ãŠã®Assignmentãªããžã§ã¯ããè¿ããŸãã ã€ãŸããçµæã«ã¯äžé©åãªããªã·ãŒããã®é©åãªã«ãã¬ããžãå«ãŸããŠããŸããã
ããã¹ãŠãã¡ãœããã¯åæã«ãIEnumerable <Insurance>ã§ã¯ãªããIEnumerable <IResolutionContext <Insurance >>ãè¿ããŸãã æåŸã®ãã®ãååŸããã«ã¯ãæœåºãã£ãŒã«ãå€ãéžæããŸãã IResolutionContextã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããšãçŸåšã®èŠªã«é©ããåãšã³ãã£ãã£ã®ãªã¹ããååŸã§ããŸãã äŸïŒ
var insurances = context.All<Insurance>(insuranceKey); var firstPolicyCoverages = insurances.First().Get<Assignment>(assignmentKey);
ããã§ãT1-key1ãšT2-key2ã®ä»»æã®2ã€ã®ãã¢ã«ã€ããŠã次ã®æ¡ä»¶ãçã§ããããšã«èšåããããšãéèŠã§ã-ã³ã³ããã¹ãT1-key1ããããããå€æ°ã§ãããšããŸããã
IResolutionContext<T1> c1
ãT2-key2ã³ã³ããã¹ãã³ã¬ã¯ã·ã§ã³ãååŸ IEnumerable<IResolutionContext<T2>> cs2 = c1.Get<T2>(key2)
ããã®ã³ã¬ã¯ã·ã§ã³ã®ä»»æã®èŠçŽ ãããT1-key1ãžã®ã³ãŒã«ããã¯ãäœæã§ããŸããçµæã®ã³ã¬ã¯ã·ã§ã³ã«ã¯å
ã®èŠçŽ ãå«ãŸããŸãã cs2.All(x => x.Get<T1>(key1).Contains(c1)) == true
ããã«ãc1èŠçŽ ãšcs2èŠçŽ ã®éã§ã¯ãçµã¿åããããã£ã«ã¿ãŒã«ç€ºãããŠãããã¹ãŠã®æ¡ä»¶ãæºããããŸãã
è€åãã£ã«ã¿ãŒ
å Žåã«ãã£ãŠã¯ã2ã€ã®ãšã³ãã£ãã£ã®ãã£ãŒã«ããæ¯èŒããå¿ èŠããããŸãã ãã®ãããªãã£ã«ã¿ãŒã®äŸïŒ
And assignment A covers less people than maximum dependents specified in insurance A
æ¡ä»¶ã¯ããã¡ãããä»ã®äžéšã®ãã®ãšåæ§ã«éçŸå®çã§ãã ããã誰ã«ãè¿·æããããªãããšãé¡ã£ãŠããŸããäžäŸã¯äžäŸã§ãã
ãã®ãããªã¹ãããã®å®çŸ©ïŒ
context .For<Assignment>(assignmentKey) .For<Insurance>(insuranceKey) .IsTrue((assignment, insurance) => assignment.HeadCount < insurance.MaximumDependents);
ãã®ãã£ã«ã¿ãŒã¯ãããªãŒã®ã«ãŒãããæãé ããšã³ãã£ãã£ïŒãã®å Žåã¯å²ãåœãŠïŒã«å²ãåœãŠãããå®è¡ã®ããã»ã¹ã§ãèµ€ãç¢å°ãäžã«ç§»åããŠä¿éºãæ€çŽ¢ããŸãïŒæåã®å³ïŒã
ç°ãªãããŒãæã€åãã¿ã€ãã®2ã€ã®ãšã³ãã£ãã£ããã£ã«ã¿ã«åå ããå Žåããããã®éã«äžçåŒãã£ã«ã¿ãèªåçã«é©çšãããŸãã
ã€ãŸãã.For <Assignment>ïŒ "a"ïŒ.For <Assignment>ïŒ "b"ïŒã®å Žåãã©ã ãïŒa1ãa2ïŒ=>ã¯äž¡æ¹ã®åŒæ°ã§åããšã³ãã£ãã£ãååŸããŸããã
ã»ãšãã©ã®å Žåã3ã€ã®ãšã³ãã£ãã£ã䜿çšããæ¡ä»¶ã¯æçã«åå²ãããå¯èœæ§ãããããããã£ã«ã¿ãŒã§2ã€ã®ãšã³ãã£ãã£ã䜿çšã§ãããšããäºå®ã«éå®ããŸããã æè¡çãªå¶éã¯ãããŸããããããªãã«ããã£ã«ã¿ãŒãèªç±ã«è¿œå ã§ããŸãã
ã³ã¬ã¯ã·ã§ã³ã®ãã£ã«ã¿ãŒ
ã³ã¬ã¯ã·ã§ã³ã®ããã€ãã®ãã£ã«ã¿ãŒã¯æ¢ã«é 眮ãããŠããããã®ãã¡ã®1ã€-Existsã¯æ¢ã«äœ¿çšãããŠããŸãã DoesNotExistããã³Eachãã£ã«ã¿ãŒããããŸãã
æåéãã以äžãæå³ããŸã-å°ãªããšã1ã€ã®åãšã³ãã£ãã£ãããå Žåã芪ãšã³ãã£ãã£ïŒãã®å Žåã¯ä¿éºïŒã¯é©æ ŒãšèŠãªãããŸã-å²ãåœãŠãé©æ Œã§ãã ããã¯ååšããããã§ãã DoesNotExistã®å Žå-æ¡ä»¶ã«äžèŽããå²ãåœãŠããªãå Žåãããã³Each-ãã®ä¿éºã®ãã¹ãŠã®å²ãåœãŠãæ¡ä»¶ã«é©åããå Žåã
ããã«ãã³ã¬ã¯ã·ã§ã³ã«ç¬èªã®ãã£ã«ã¿ãŒãèšå®ã§ããŸãã äŸïŒ
context.ForAll<Assignment>(key) .IsTrue(assignments => assignments.Sum(x => x.HeadCount) > 0);
ãã¡ãããé©åãªå²ãåœãŠã ããã³ã¬ã¯ã·ã§ã³ã®ãã£ã«ã¿ãŒã«åé¡ãããŸããã€ãŸããæåã«ç¬èªã®ãã£ã«ã¿ãŒãééããå²ãåœãŠã§ãã
2çªç®ã®äŸã§ã¯ã2ã€ã®ã³ã¬ã¯ã·ã§ã³ãæ¯èŒããŸãã
ããšãã°ãSpecFlowããã¹ãïŒ
And average payment per person in assignments B, specified in taxes B is over 10$
ããã³å¯Ÿå¿ããå®çŸ©ïŒ
context .ForAll<Assignment>(assignmentKey) .ForAll<Tax>(taxKey) .IsTrue((assignments, taxes) => taxes.Sum(x => x.Amount) / assignments.Sum(x => x.HeadCount) > average);
å¥ã®ãã¹ãææ³
ããªãã¯ã¯ãæåã«å®å šã«æºãããããªããžã§ã¯ããæºåããããŒãžïŒWebã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠããããšãæå³ããŸãïŒãhappy-pathã¹ã¯ãªãããæ£åžžã«æºãããŠããããšã確èªãããã®åŸãåŸç¶ã®åãã¹ãã§åããªããžã§ã¯ãã䜿çšããŠäœãã1ã€ãã€å£ããããŒãžããŠãŒã¶ãŒã«é©åãªèŠåãçºè¡ããããšã確èªããŸãã ããšãã°ãhappy-pathã«è©²åœãããŠãŒã¶ãŒã«ã¯ããã¹ã¯ãŒããã¡ãŒã«ãã¢ãã¬ã¹ãã¢ã¯ã»ã¹æš©ãªã©ãå¿ èŠã§ãã ãããŠãæªããã¹ãã®å ŽåãåããŠãŒã¶ãŒã䜿çšããããã¹ã¯ãŒããç Žããã次ã®ãã¹ãã¡ãŒã«ãç¡å¹ã«ãªããŸãã
ããŒã¿ãæ€çŽ¢ãããšãã«åãææ³ã䜿çšã§ããŸãã
Background: Given insurance B is taken from insurancesSource And for insurance B exists an assignment B And for insurance B exists a tax B Scenario: No assignment with needed count and type Given there is no suitable assignment B Scenario: No tax with needed amount and type Given there is no suitable tax B
ç§ãåŒçšããããã¹ãã¯å®å šã§ã¯ãªããéèŠãªè¡ã®ã¿ã§ãã ãã®äŸã®ãèæ¯ãã»ã¯ã·ã§ã³ã§ã¯ãããããŒãã¹ã«å¿ èŠãªãã¹ãŠã®ç»é²ãèšå®ãããç¹å®ã®ãæªããã·ããªãªã§ã¯ãã£ã«ã¿ãŒã®1ã€ãå転ãããŸãã ããããŒãã¹ãã¹ãã§ã¯ãé©åãªå²ãåœãŠãšé©åãªçšéãããä¿éºãèŠã€ãããŸãã æåã®ãäžè¯ããã¹ãã§ã¯ãé©åãªå²ãåœãŠããªãä¿éºãèŠã€ããã2çªç®ã®ãã¹ãã§ã¯ãé©åãªçšéããªãä¿éºãããããèŠã€ãããŸãã ãã®ãããªå転ã¯ã次ã®ããã«å«ããããšãã§ããŸãã
context.InvertCollectionValidity<Assignment>(key);
ããã«ãç¹å®ã®ããŒãä»»æã®ãã£ã«ã¿ãŒã«å²ãåœãŠããã®ããŒã§ãã®ãã£ã«ã¿ãŒãå転ã§ããŸãã
倱æããæ€çŽ¢ãã°
å€ãã®ãã£ã«ã¿ãŒãæå®ãããŠããå Žåãæ€çŽ¢ãäœãè¿ããªãçç±ãããã«ç解ããããšã¯ã§ããŸããã ãã¡ãããäºåæ³ã§ããã«å¯ŸåŠããã®ã¯éåžžã«ç°¡åã§ããã€ãŸãããã£ã«ã¿ãŒã®ååãã³ã¡ã³ãã¢ãŠãããŠãã©ã®ãããªå€æŽãè¡ããã次ã«ååããååã«ãªãããªã©ã確èªããŸãã ãã ãã䟿å®äžãæéã³ã¹ããåæžããããã«ãæåŸã«å©çšå¯èœãªãšã³ãã£ãã£ãç¡å¹ã«ãããã£ã«ã¿ãŒããã°ã«åºåããæ©äŒãäžããããšã«ããŸããã ããã¯ãæåã®ãšã³ãã£ãã£ã3ã€ã®ãã£ã«ã¿ãŒãããšã³ãã£ãã£ã®ååãé€å€ãã2çªç®ã®ãšã³ãã£ãã£ãåŸåãé€å€ããåé¡ã3çªç®ã®ãã£ã«ã¿ãŒã«å°éããªãã£ãå Žåããã®å Žåã¯2çªç®ã«æå®ããããã£ã«ã¿ãŒãå°å·ãããããšãæå³ããŸãã ãããè¡ãã«ã¯ãOnSearchFailureã€ãã³ãããµãã¹ã¯ã©ã€ãããå¿ èŠããããŸãã
ããã ãã§ã ãããžã§ã¯ãã¯githubã§å ¥æã§ããŸãgithub.com/repinvv/TestingContext
å®æããã¢ã»ã³ããªã¯ãNuGet www.nuget.org/packages/TestingContextã§ååŸã§ããŸãã